背包分为01背包,多重背包以及完全背包这三种基本模型,其他的背包问题都是从这3种背包中延申出来的。
https://www.luogu.com.cn/problem/P1616(完全背包)
完全背包的模板题面是这样的:设有n种物品,每种物品有一个重量及一个价值。但每种物品的数量是无限的,同时有一个背包,最大载重量为M,今从n种物品中选取若干件(同一种物品可以无限选取),使其重量的和小于等于M,而价值的和为最大。
完全背包代码段:
for(int i=1;i<=n;i++)
for(int j=w[i];j<=V;j++)
f[j]=max(f[j],f[j-w[i]]+c[i]);
01背包代码段:
for(int i=1;i<=n;i++){
for(int j=m;j>=s[i];j--){
f[j]=max(f[j],f[j-s[i]]+v[i]);}}
https://www.luogu.com.cn/problem/P1802
手写AC代码:
#include<iostream>
#include<algorithm>
using namespace std;
long long p[1005][3], f[1005];
int main() {
int n, x;
ios_base::sync_with_stdio(false);
cin >> n >> x;
int i, j;
for (i = 1; i <= n; i++) {
for (j = 0; j < 3; j++) {
cin >> p[i][j];
}
}
for (i = 1; i <= n; i++) {
for (j = x; j >= 0; j--) {//修改了判断条件
if (j >= p[i][2]) {
f[j] = max(f[j] + p[i][0], f[j - p[i][2]] + p[i][1]);
}
else {
f[j] += p[i][0];
}
}
}
cout << f[x]*5 << endl;
return 0;
}