背包九讲里面的多重背包问题。每一块积木有高度和数量,也有最大能到的高度位置限制。我们DP前首先要对高度限制进行排序,因为从直观角度说,我们也需要先处理较小的能到高度的积木,这样才能取到最大值。例如第一个高度是11,限制高度是100,第二个的限制高度是10,那如果直接处理,第二个不会被处理到。
#include<stdio.h> #include<stdlib.h> #include<string.h> #define max(x,y)(x>y?x:y) struct block { int h; int a; int c; }; struct block data[410]; int dp[40010]={0}; int cmp(const void*p1,const void*p2) { return (*( block*)p1).a > (*( block*)p2).a?1:-1; } int main(){ int k,i,j,m; scanf("%d",&k); for(i=0;i<k;i++){ scanf("%d %d %d",&data[i].h,&data[i].a,&data[i].c); } qsort(data,k,sizeof(data[0]),cmp); memset(dp,0,sizeof(dp)); for(i=0;i<k;i++){ for(m=1;m<=data[i].c;m++) for(j=data[i].a;j>=data[i].h;j--) dp[j]=max(dp[j],dp[j-data[i].h]+data[i].h); } int ans=0; for(i=0;i<=data[k-1].a;i++) ans=max(ans,dp[i]); printf("%d\n",ans); return 0; }
时间: 2024-10-09 19:08:08