Sicily 1750 運動會

分組揹包問題

#include <stdio.h>
#include <vector>
using namespace std;
#include <memory.h>
#include <algorithm>
int p,n;
int dp[120][1200];
struct Item {
    int energy;
    int award;
};
int get_max(int a, int b) {
    if (a>b)
        return a;
    else
        return b;
}
vector<Item> items[120];
void packet_dp() {
    int i,j,k;
    memset(dp,0,sizeof(dp));
    
    for (i=0;i<n;i++) {
        if (items[i].size()==0)
            continue;
        for (j=p;j>=0;j--) {
            if (i>0)
                dp[i][j]=dp[i-1][j];
            for (k=0;k<items[i].size();k++) {
                if (j>=items[i][k].energy) {
                    if (i>0)
                        dp[i][j]=get_max(dp[i][j], dp[i-1][j-items[i][k].energy]+items[i][k].award);
                    else 
                        dp[i][j]=get_max(dp[i][j], dp[i][j-items[i][k].energy]+items[i][k].award);
                }
            }
        }
    }
}
int main() {
    int t,i;
    int d,e,m;
    Item tmp;
    int result;
    
    scanf("%d",&t);
    while (t--) {
        for (i=0;i<120;i++)
            items[i].clear();
        scanf("%d%d",&p,&n);
        for (i=0;i<n;i++) {
            scanf("%d%d%d",&d,&e,&m);
            tmp.energy=e;
            tmp.award=m;
            items[d].push_back(tmp);
        }
        packet_dp();
        result=0;
        for(i=0;i<120;i++) {
            if (dp[i][p]>result)
                result=dp[i][p];
        }
        printf("%d\n", result);
    }
    return 0;
}                 


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