POJ-2392 多重揹包

送牛上太空的一道題:有K種類型的方塊,每行表示方塊高度,能堅持的極限高度,方塊個數

一維dp[i]數組表示高度i是否可行,初始爲0

關鍵代碼爲三層for循環,外層i看不同的方塊(方塊已經排過序),第二層j遍歷同一種方塊的個數,第三層k遍歷高度

從低高度到高高度正向做應該也行,但是寫起來比較複雜,反向去做代碼比較簡潔

#include<cstring>
#include<iostream>
#include<cstdio>
#include<cmath>
#include<algorithm>
using namespace std;

struct node{
    int h,a,c;
}block[410];//tower blocks

int dp[40010];//高度爲i可行嗎


bool cmp(node a,node b){
    return a.a<b.a;
}

int main()
{
    //freopen("in.txt","r",stdin);
    int n;
    while(cin>>n){
        memset(dp,0,sizeof(dp));
        for(int i=0;i<n;i++){
            cin>>block[i].h>>block[i].a>>block[i].c;
        }
        sort(block,block+n,cmp);
        dp[0] = 1;
        for(int i=0;i<n;i++){
            for(int j=0;j<block[i].c;j++){
                for(int k=block[i].a;k>=block[i].h;k--){
                    dp[k] |= dp[k-block[i].h];
                }
            }
        }
        for(int i=block[n-1].a;i>=0;i--){
            if(dp[i]){
                cout<<i<<endl;
                break;
            }
        }
    }
    return 0;
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章