题解 | 金明的预算-NOIP2006提高组复赛

金明的预算方案

https://ac.nowcoder.com/acm/contest/254/B

算法知识点: DP,分组背包问题

复杂度:

解题思路:

可以将每个主件及其附件看作一个物品组,记主件为 ,两个附件为,则最多一共有4种组合:

这四种组合是互斥的,最多只能从中选一种,因此可以将每种组合看作一个物品,那么问题就变成了分组背包问题。

C++ 代码:

#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
 
typedef pair <int, int> PII;
const int N = 70,
    M = 32010;
 
int m, n;
PII a[N];
vector<PII> b[N];
int f[M];
 
int main()
{
    scanf("%d%d", &m, &n);
    for (int i = 1; i <= n; i++)
    {
        int v, w, p;
        scanf("%d%d%d", &v, &w, &p);
        w *= v;
        if (!p) a[i] = {
            v, w
        };
        else b[p].push_back(
        {
            v, w
        });
    }
 
    for (int i = 1; i <= n; i++)
    {
        if (!a[i].first) continue;
 
        for (int j = m; j >= 0; j--)
            for (int k = 0; k < 1 << b[i].size(); k++)
            {
                int v = a[i].first, w = a[i].second;
                for (int u = 0; u < b[i].size(); u++)
                    if (k >> u &1)
                    {
                        v += b[i][u].first;
                        w += b[i][u].second;
                    }
 
                if (j >= v) f[j] = max(f[j], f[j - v] + w);
            }
    }
 
    printf("%d\n", f[m]);
 
    return 0;
}


另外,牛客暑期NOIP真题班限时免费报名
报名链接:https://www.nowcoder.com/courses/cover/live/248
报名优惠券:DCYxdCJ
全部评论

相关推荐

04-21 13:50
已编辑
北京理工大学 硬件测试
我们学校连夜发了声明,绝了绝了!看完了全部ppt,震碎三观。一般情况下我是站学生的,但这不是一般情况。这男的不能被取消学位吗?自己吃到了红利,靠着面试泄题得到的保研,又反手举报导师。这导师是《被举报系列》里最惨最恋爱脑的了,当然最可怜的是他的同妻……
牛客小黄鱼:看了ppt的聊天记录,真不知道谁才是受害者!有人为你剥过柚子吗?有人为你雪地里等你吗?有人为你写过情书吗?有人为你规划未来吗?有人为你小心翼翼吗?有人为你整页失眠失眠吗? 有人为你送上自己的科研成果吗?有人为你安排出国留学吗?有人愿意给你一个月2万吗?
点赞 评论 收藏
分享
我的名字是句号:接好运
点赞 评论 收藏
分享
评论
2
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务