基本知识
关键在于k的拆分 !!!
例题——珍惜现在,感恩生活
代码
#include <iostream>
using namespace std;
const int MAXN = 10000;
int dp[MAXN];
int value[MAXN]; // 分解后物品价值
int weight[MAXN]; // 分解后物品质量
int main(){
int caseNumber;
cin>>caseNumber;
while(caseNumber--){
int n,m,v,w,k;
cin>>m>>n; // n件物品,m容量背包
int number=0; // 分解后物品的数量
for(int i=0;i<n;i++){
cin>>w>>v>>k;
for(int j=1;j<=k;j<<=1){
value[number] = j*v;
weight[number] = j*w;
number++;
k-=j;
}
if(k>0){
value[number] = k*v;
weight[number] = k*w;
number++;
}
}
for(int i=0;i<=m;i++){
dp[i]=0;
}
for(int i=0;i<number;i++){
for(int j=m;j>=weight[i];j--){
dp[j] = max(dp[j],dp[j-weight[i]]+value[i]);
}
}
cout<<dp[m]<<endl;
}
return 0;
}