本题是一个多重背包问题,可以转化为01背包问题求解,转化的过程中注意和完全背包问题的差异。原题链接地址:点击打开链接
C++代码:
#include<stdio.h>
int main(){
//freopen("1.txt","r",stdin);
int C,n,m;int p[101],w[101],c[101],dp[101],nP[500],nW[500];
scanf("%d",&C);
while(C--){
scanf("%d%d",&n,&m);int index=0;
for(int i=0;i<m;i++){
scanf("%d%d%d",&p[i],&w[i],&c[i]);
int k=1;
while(k<=c[i]){
nP[index]=k*p[i];
nW[index++]=k*w[i];
c[i]-=k;
k*=2;
}
k=k/2;
if(c[i]>0){
nP[index]=c[i]*p[i];
nW[index++]=c[i]*w[i];
}
}
for(int i=0;i<=n;i++)
dp[i]=0;
for(int i=0;i<index;i++){
for(int j=n;j>=nP[i];j--){
if(dp[j]<(dp[j-nP[i]]+nW[i]))
dp[j]=dp[j-nP[i]]+nW[i];
}
}
printf("%d\n",dp[n]);
}
return 0;
}