題目大意,給你一些塊,每個塊的高度爲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動態規劃還是得多敲,這個東西,經驗很重要,對於我這個渣渣來說。