题目描述
知识点
多重背包问题
实现
码前思考
- 多重背包问题,直接套模板
代码实现
//属于多重背包问题
#include "bits/stdc++.h"
using namespace std;
const int maxn = 110;
//注意应该是500,考虑到多重背包的原因
const int maxm = 500;
//测试用例的数量
int C;
//钱的总数
int n;
//大米种类
int m;
//大米价钱数组
int p[maxm];
//大米重量数组
int h[maxm];
//大米袋数
int c[maxm];
//dp数组
int dp[maxn];
int main(){
scanf("%d",&C);
while(C--){
scanf("%d %d",&n,&m);
//len表示多重背包的物品数
int len = 0;
for(int i=1;i<=m;i++){
int x,y,z;
scanf("%d %d %d",&x,&y,&z);
//其实就是二进制编码
int j;
for(j=1;z-j>0;j=j*2){
len++;
p[len] = j * x;
h[len] = j * y;
z = z-j;
}
len++;
p[len]=z*x;
h[len]=z*y;
}
//对dp进行初始化
for(int j=0;j<=n;j++){
dp[j] = 0;
}
for(int i=1;i<=len;i++){
//01背包的解法
for(int j=n;j >= p[i];j--){
dp[j] = max(dp[j],dp[j-p[i]]+h[i]);
}
}
printf("%d\n",dp[n]);
}
return 0;
}
码后反思
- 没有理解多重背包问题,只会套模板,(lll¬ω¬)