题目大意,给你一些块,每个块的高度为Hi,能堆到最大高度为Ai,能使用的次数为Ci。问你最大能堆多大的高度。
很明显多重背包,但是不用计数什么的,就用dp[i]表示能不能到达i
然后递推的时候更新最大值。
但是有一个点需要考虑,一个是需要排序,就是先选Ai小的物品,这样才可能堆的高。
下面贴代码
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
using namespace std;
struct po
{
int h,a,c;
};
bool cmp(po a,po b)
{
return a.a<=b.a;
}
po mm[410];
int sum[410000];
int dp[400010];
int main()
{
int n;
scanf("%d",&n);
for(int i=0;i<n;i++) scanf("%d%d%d",&mm[i].h,&mm[i].a,&mm[i].c);
sort(mm,mm+n,cmp);
memset(dp,0,sizeof(dp));
dp[0] = 1;//初始化
int ans = 0;
for(int i=0;i<n;i++){
memset(sum,0,sizeof(sum));//计数用了多少个
for(int j=mm[i].h;j<=mm[i].a;j++){
if(!dp[j] && dp[j-mm[i].h] && sum[j-mm[i].h] < mm[i].c){
dp[j] = 1;
ans = max(ans,j);
sum[j] = sum[j-mm[i].h] + 1;
}
}
}
printf("%d\n",ans);
return 0;
}
dp动态规划还是得多敲,这个东西,经验很重要,对于我这个渣渣来说。