题意 :给定n种积木,每种积木都有一个高度hi,一个数量ci,还有一个限制条件,这个积木所在的位置不能高于ai,问能叠起的最大高度
// 这里有个问题需要注意 就是ai小的要先进行背包 不然 在 ai高度下 L1L2 和 L2L1是不一样的
// 然后就是简单的0-1背包了
#include <iostream>
#include <algorithm>
#include <queue>
#include <math.h>
#include <stdio.h>
#include <string.h>
using namespace std;
#define MOD 1000000007
#define maxn 40010
int dp[maxn];
struct node{
int h;
int a;
int c;
bool operator <(const node &t) const{
return a<t.a;
}
}ar[410];
int main()
{
int K;
while(scanf("%d",&K)!=EOF){
int i,j,k;
for(i=0;i<K;i++)
scanf("%d %d %d",&ar[i].h,&ar[i].a,&ar[i].c);
sort(ar,ar+K);
memset(dp,0,sizeof(dp));
for(i=0;i<K;i++){
for(k=1;k<=ar[i].c;k++)
for(j=ar[i].a;j>=ar[i].h;j--)
dp[j]=max(dp[j],dp[j-ar[i].h]+ar[i].h);
}
int ans=0;
for(i=0;i<=ar[K-1].a;i++) ans=max(ans,dp[i]); // 开始直接输出了dp[ar[K-1].a] ,WA 下面数据就说明了问题
// 2
// 5 11 3
// 8 12 2
printf("%d
",ans);
}
return 0;
}