0-1 背包:return 重量和 C++ 中的最大值
0-1 Knapsack: return weight and maximum value in C++
我们知道在 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));
}
这是您的问题的解决方案。你必须使用配对。
#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 背包问题中,我们从一些容量有限的物品中获得最大收益。 (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));
}
这是您的问题的解决方案。你必须使用配对。
#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