链接:点击打开链接
题意:给出K个方块的高度,数量和最高能够放多高,求出最大能放多高
代码:
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
struct node{
int h_i,a_i,c_i;
};
bool cmp(node x,node y){
return x.a_i<y.a_i;
}
node s[405];
int f[40005],used[40005];
int main(){
int k,i,j,ans;
while(scanf("%d",&k)!=EOF){
for(i=0;i<k;i++)
scanf("%d%d%d",&s[i].h_i,&s[i].a_i,&s[i].c_i);
sort(s,s+k,cmp); //排序的目的是为了,先把小砖块能达到
ans=0;f[0]=1; //的值记录上,如果先选大的小的可能因
for(i=0;i<k;i++){ //高度限制的原因而没有作用
memset(used,0,sizeof(used));
for(j=s[i].h_i;j<=s[i].a_i;j++){
if(!f[j]&&f[j-s[i].h_i]&&used[j-s[i].h_i]<s[i].c_i){
f[j]=1;
used[j]=used[j-s[i].h_i]+1;
if(ans<j)
ans=j;
}
} //多重背包
}
printf("%d\n",ans);
}
return 0;
}