背包九讲里面的多重背包问题。每一块积木有高度和数量,也有最大能到的高度位置限制。我们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;
}