C++ 如何使用递归打印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

我有一个递归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( 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可能有用可能有用