码迷,mamicode.com
首页 > 其他好文 > 详细

P1064 金明的预算方案 暴力DP 背包

时间:2020-07-30 22:20:53      阅读:91      评论:0      收藏:0      [点我收藏+]

标签:依赖   bsp   i++   col   class   tor   span   res   背包问题   

据传这类问题叫做有依赖性的背包问题:
选某个物品的同时必须连带选其他物品

容易想到其实是决策发生了变化:

可以选啥都不选

可以只选主件

可以选主件+一个附件

可以选主件+两个附件

其他和01背包一样

struct Bag {
    int w;
    int val;
    Bag(int x = 0,int y = 0) : w(x),val(y){}
};


vector<Bag> a[65];
Bag s[65];
int vis[65];
int dp[32005];

int main() {
    int n, m;
    int x, y, z;
    n = readint(), m = readint();
    for (int i = 0; i < m; i++) {
        x = readint(), y = readint(), z = readint();
        if (!z) s[i].val = y, s[i].w = x;
        else a[z - 1].push_back(Bag(x, y)), vis[i] = -1;
    }
    for (int i = 0; i < m; i++) {
        if (vis[i] == -1) continue;
        for (int j = n; j >= s[i].w; j--) {
            int res = dp[j];
            res = max(res, dp[j - s[i].w] + s[i].val * s[i].w);
            if (!a[i].empty()) {
                if (j - s[i].w - a[i][0].w >= 0) res = max(res, dp[j - s[i].w - a[i][0].w] + s[i].val * s[i].w + a[i][0].val * a[i][0].w);
                if (a[i].size() > 1) {
                    if (j - s[i].w - a[i][1].w >= 0) res = max(res, dp[j - s[i].w - a[i][1].w] + a[i][1].val * a[i][1].w + s[i].val * s[i].w);
                    if (j - s[i].w - a[i][0].w - a[i][1].w >= 0) res = max(res, dp[j - s[i].w - a[i][0].w - a[i][1].w] + s[i].val*s[i].w + a[i][0].val * a[i][0].w+ a[i][1].w * a[i][1].val);
                }
            }
            dp[j] = res;
        }
    }
    Put(dp[n]);
}

 

P1064 金明的预算方案 暴力DP 背包

标签:依赖   bsp   i++   col   class   tor   span   res   背包问题   

原文地址:https://www.cnblogs.com/hznumqf/p/13405970.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!