POJ 2392 Space Elevator 排序+多重揹包

題目鏈接

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

發佈了40 篇原創文章 · 獲贊 7 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章