0
点赞
收藏
分享

微信扫一扫

金明的预算方案

yundejia 2022-02-06 阅读 63

输入:

输出:

样例:

一道有依赖性的01背包问题,分为五种情况,
1.不选主件
2.只选主件
3.选主件和附件1
4.选主件和附件2
5.选主件和附件1和附件2

代码:

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=2e5+10;
int av[N],aw[N],bw[N][3],bv[N][3],dp[N];
int main()
{
    ios::sync_with_stdio(false);
    int n,m;
    cin>>n>>m;
    int v,p,q;
    for(int i=1;i<=m;i++){
        cin>>v>>p>>q;
        if(q==0){
            av[i]=v;
            aw[i]=v*p;
        }
        else{
            bv[q][0]++;
            bv[q][bv[q][0]]=v;
            bw[q][bv[q][0]]=v*p;
        }
    }
    for(int i=1;i<=m;i++){
        for(int j=n;j>=av[i];j--){
            dp[j]=max(dp[j],dp[j-av[i]]+aw[i]);
            if(j>=av[i]+bv[i][1])
                dp[j]=max(dp[j],dp[j-av[i]-bv[i][1]]+aw[i]+bw[i][1]);
            if(j>=av[i]+bv[i][2])
                dp[j]=max(dp[j],dp[j-av[i]-bv[i][2]]+aw[i]+bw[i][2]);
            if(j>=av[i]+bv[i][1]+bv[i][2])
                dp[j]=max(dp[j],dp[j-av[i]-bv[i][1]-bv[i][2]]+aw[i]+bw[i][1]+bw[i][2]);
        }
    }
    cout<<dp[n]<<endl;
    return 0;
}
举报

相关推荐

0 条评论