C++ 如何使用递归打印0/1背包问题中选定的元素
我有一个递归0/1背包的代码。我想将所选元素与利润一起打印。 代码只提供利润。 任何帮助都将不胜感激C++ 如何使用递归打印0/1背包问题中选定的元素,c++,c++14,dynamic-programming,C++,C++14,Dynamic Programming,我有一个递归0/1背包的代码。我想将所选元素与利润一起打印。 代码只提供利润。 任何帮助都将不胜感激 #include<iostream> #include<vector> #include<climits> using namespace std; int knapSack( int weight, int wt[], int val[], int n) { if( weight <= 0 ) return 0; if
#include<iostream>
#include<vector>
#include<climits>
using namespace std;
int knapSack( int weight, int wt[], int val[], int n)
{
if( weight <= 0 )
return 0;
if( n < 0 )
return 0;
// nth element is excluded
int exclude = knapSack(weight, wt, val, n-1);
// nth element is included
int include = knapSack(weight - wt[n], wt, val, n-1) + val[n];
return max( include, exclude);
}
int main()
{
int val[] = {60, 100, 120};
int wt[] = {10, 20, 30};
int W = 50;
int n = sizeof(val)/sizeof(val[0]);
cout<<knapSack(W, wt, val, n-1);
return 0;
}
#包括
#包括
#包括
使用名称空间std;
整数背包(整数重量,整数重量[],整数价值[],整数n)
{
如果(权重您可以使用向量来保存收集的项目
int knapSack( int weight, int wt[], int val[], int n, vector<int>& items)
{
if( n < 0 ) {
return 0;
}
vector<int> tmp1 = items;
vector<int> tmp2 = items;
// nth element is excluded
int exclude = knapSack(weight, wt, val, n-1, tmp1);
// nth element is included
int include = 0;
if (weight >= wt[n]) {
tmp2.push_back(val[n]);
include = knapSack(weight - wt[n], wt, val, n-1, tmp2) + val[n];
}
items = (include >= exclude) ? tmp2 : tmp1;
return max( include, exclude);
}
int main()
{
int val[] = {60, 100, 120};
int wt[] = {10, 20, 30};
int W = 50;
vector<int> items;
int n = sizeof(val)/sizeof(val[0]);
int profit = knapSack(W, wt, val, n-1, items);
cout << "profit: " << profit << endl;
cout << "items: ";
for (auto it = items.begin(); it != items.end(); it++) {
cout << *it << " ";
}
return 0;
}
int背包(int-weight,int-wt[],int-val[],int-n,向量和物品)
{
if(n<0){
返回0;
}
向量tmp1=项目;
向量tmp2=项目;
//不包括第n个元素
int exclude=背包(重量、重量、体积、n-1、tmp1);
//包括第n个元素
int include=0;
如果(重量>=重量[n]){
tmp2.推回(val[n]);
包括=背包(重量-重量[n],重量,val,n-1,tmp2)+val[n];
}
项目=(包括>=排除)?tmp2:tmp1;
返回最大值(包括、排除);
}
int main()
{
int val[]={60100120};
int wt[]={10,20,30};
int W=50;
向量项;
int n=sizeof(val)/sizeof(val[0]);
int利润=背包(W、wt、val、n-1、物品);
cout您可以使用向量来保存收集的项目
int knapSack( int weight, int wt[], int val[], int n, vector<int>& items)
{
if( n < 0 ) {
return 0;
}
vector<int> tmp1 = items;
vector<int> tmp2 = items;
// nth element is excluded
int exclude = knapSack(weight, wt, val, n-1, tmp1);
// nth element is included
int include = 0;
if (weight >= wt[n]) {
tmp2.push_back(val[n]);
include = knapSack(weight - wt[n], wt, val, n-1, tmp2) + val[n];
}
items = (include >= exclude) ? tmp2 : tmp1;
return max( include, exclude);
}
int main()
{
int val[] = {60, 100, 120};
int wt[] = {10, 20, 30};
int W = 50;
vector<int> items;
int n = sizeof(val)/sizeof(val[0]);
int profit = knapSack(W, wt, val, n-1, items);
cout << "profit: " << profit << endl;
cout << "items: ";
for (auto it = items.begin(); it != items.end(); it++) {
cout << *it << " ";
}
return 0;
}
int背包(int-weight,int-wt[],int-val[],int-n,向量和物品)
{
if(n<0){
返回0;
}
向量tmp1=项目;
向量tmp2=项目;
//不包括第n个元素
int exclude=背包(重量、重量、体积、n-1、tmp1);
//包括第n个元素
int include=0;
如果(重量>=重量[n]){
tmp2.推回(val[n]);
包括=背包(重量-重量[n],重量,val,n-1,tmp2)+val[n];
}
项目=(包括>=排除)?tmp2:tmp1;
返回最大值(包括、排除);
}
int main()
{
int val[]={60100120};
int wt[]={10,20,30};
int W=50;
向量项;
int n=sizeof(val)/sizeof(val[0]);
int利润=背包(W、wt、val、n-1、物品);
cout可能有用可能有用