hdu 2191 悼念512汶川大地震遇难同胞——珍惜现在,感恩生活(完全背包)
看题目请点这里
题意:
中文题不解释。
代码:
#include<iostream>using namespace std;#define max(x,y) x>y?x:yint i,j,p[101],h[101],c[101],dp[101];void zeroone(int i,int n) //01背包{ int t=c[i],k=1; while(k<t) //2进制思想 { for(j=n;j>=p[i]*k;j--) { dp[j]=max(dp[j],dp[j-p[i]*k]+h[i]*k); } t-=k;k*=2; } for(j=n;j>=p[i]*k;j--) { dp[j]=max(dp[j],dp[j-p[i]*t]+h[i]*t); }}void complete(int i,int n) //完全背包{ for(j=p[i];j<=n;j++) { dp[j]=max(dp[j],dp[j-p[i]]+h[i]); }}int main(){ int C,n,m; scanf("%d",&C); while(C--) { scanf("%d %d",&n,&m); for(i=0;i<m;i++) { scanf("%d %d %d",p+i,h+i,c+i); } memset(dp,0,sizeof(dp)); for(i=0;i<m;i++) { c[i]*p[i]>=n ? complete(i,n) : zeroone(i,n); //物品充足,完全背包,否则01背包 } printf("%d\n",dp[n]); } return 0;}