【发布时间】: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 相关。我没有发现任何难以理解的内容。
标签: c++ dynamic-programming knapsack-problem