题意:一群牛要上太空,给出n种石块,每种石块给出单块高度,总高度不能超过的最大值,数量,要求
用这些石块能组成的最大高度
思路:在进行多重背包之前要进行一次排序,将最大高度小的放在前面,只有这样才能得到最优解,如果
将大的放在前面,后面有的小的就不能取到,排序之后就可以进行多重背包了
#include<cstdio> #include<iostream> #include<cstring> #include<algorithm> using namespace std; struct node { int h,a,c; }k[410]; int used[400000]; int dp[400000]; bool cmp(node x,node y) { return x.a<y.a; } int main() { int n,ans; while(scanf("%d",&n)!=EOF) { for(int i=0;i<n;i++) scanf("%d%d%d",&k[i].h,&k[i].a,&k[i].c); sort(k,k+n,cmp); memset(dp,0,sizeof(dp)); dp[0]=1; ans=0; for(int i=0;i<n;i++) { memset(used,0,sizeof(used)); for(int j=k[i].h;j<=k[i].a;j++) { if(!dp[j] && dp[j-k[i].h] && used[j-k[i].h]<k[i].c) { dp[j]=1; used[j]=used[j-k[i].h]+1; //计算所用石头个数 if(j>ans) ans=j; } } } printf("%d\n",ans); } return 0; }