0-1 背包:在 C++ 中返回重量和最大值

Posted

技术标签:

【中文标题】0-1 背包:在 C++ 中返回重量和最大值【英文标题】:0-1 Knapsack: return weight and maximum value in C++ 【发布时间】:2015-05-19 11:49:40 【问题描述】:

我们知道在 0-1 背包问题中,我们从一些容量有限的物品中获得最大收益。 (Knapsack problem)。

Example:
4 10 // 5 items, 10 capacity
1 120 // weight cost_value
4 280
3 150
4 200
Ans: 600
Total Weight: 9

但我的问题是,我想要一次获得总重量和收益。这怎么可能?我的代码会有什么变化?请用我自己的代码建议我。

#include <bits/stdc++.h>

using namespace std;

#define MAX_N 100
#define MAX_W 1000
int n;
int dp[MAX_N+1][MAX_W+1];
int weight[MAX_N+1];
int cost[MAX_N+1];
int CAP;
int func(int i,int w)

    if(i==n+1) return 0;
    if(dp[i][w]!=-1) return dp[i][w];
    int profit1=0,profit2=0;
    if(w+weight[i]<=CAP)
        profit1=cost[i]+func(i+1,w+weight[i]);

    profit2=func(i+1,w);
    dp[i][w]=max(profit1,profit2);
    return dp[i][w];

int main()

    memset(dp,-1,sizeof(dp));
    scanf("%d%d",&n,&CAP);
    for(int i=1; i<=n; i++)
    
        scanf("%d %d",&weight[i],&cost[i]);
    
    printf("%d\n",func(1,0));



【问题讨论】:

你自己实现过这个程序吗?因为它相当...微不足道... 填完动态规划矩阵后,你需要回溯它以确定哪些物品在最优解中的背包中...... 我不明白这个问题;据我了解,所有必要的信息都包含在数组dp中。 其实我想同时返回两个。我可以想象它需要一对。但我不能在代码中做到这一点。更重要的是,我不是 dp 方面的专家。我只能解决正常的dp问题。谢谢 问题与 dp 相关。我没有发现任何难以理解的内容。 【参考方案1】:

这是您问题的解决方案。你必须使用pair。

#include <bits/stdc++.h>

using namespace std;

#define PP pair<int,int>
int n,target;
int cost[102], weight[102];
int CAP;

pair<int,int> Knap(int i,int w)

    if(i==n+1) return make_pair(0,w);
    pair<int,int> profit1, profit2;

    if(w+weight[i]<=CAP) 
        pair<int,int> tmp = Knap(i+1, w + weight[i]);
        profit1 = make_pair(tmp.first+cost[i], tmp.second);
    
    else
        profit1 = make_pair(0,0);

    profit2=Knap(i+1,w);
    return max(profit1, profit2);


int main()

    int t;
    cin>>t;
    while(t--)
    
        cin>>n;
        cin>>CAP;

        for(int i=1; i<=n; i++)
        
            scanf("%d %d",&weight[i],&cost[i]);
        
        pair<int,int>P;
        P=Knap(1,0);

        cout<<P.first<<" "<<P.second<<endl;
    
    return 0;

测试:

1
4 10
1 120
4 280
3 150
4 200
Ans: 600 9

【讨论】:

以上是关于0-1 背包:在 C++ 中返回重量和最大值的主要内容,如果未能解决你的问题,请参考以下文章

0-1背包(动态规划)

0-1背包问题的动态规划实现

0,1背包问题(动态规划)

0-1 背包,因体重不足和超重情况而受到处罚

数据结构--动态规划

01背包练习题