01背包回溯法

View Code
#include<iostream>
using namespace std;
int n;
float c;
float bestv=0;
float backknap(float w[],float v[],int bestx[],int x[],float sw,float sv,int t){
    int j;
    float r;                   //剩余物品的总价值 
    if(t>=n){ 
        if(sv>bestv){          //如果解比当前解更优 
            bestv=sv;
            for(j=0;j<n;j++)   //记录最优解的路径 
               bestx[j]=x[j];
        }
    }
    else{
        if(sw+w[t]<=c){        //搜索左孩子树 
            x[t]=1;
            sw=sw+w[t];
            sv=sv+v[t];
            bestv=backknap(w,v,bestx,x,sw,sv,t+1);
            sw=sw-w[t];
            sv=sv-v[t];
        }
        r=0;
        for(j=t+1;j<n;j++)     //剩余物品的总价值 
        r=r+v[j];
        if(sv+r>bestv){        //搜索右孩子树 
            x[t]=0;
            bestv=backknap(w,v,bestx,x,sw,sv,t+1);
        }
    }
    return bestv;
}
int main(){
    cout<<"请输入n:";
    cin>>n;
    float sv=0,      // 背包当前的质量 
          sw=0;      // 背包当前的重量 
    int bestx[100],  //最优解的路径 
        x[100];      //当前解的路径 
    float w[100],    //物品的重量 
          v[100];    //物品的价值 
    cout<<"请输入物品的重量和价值:"<<endl;
    for(int i=0;i<n;i++)
       cin>>w[i]>>v[i];
    cout<<"请输入背包能承载的重量:"<<endl; 
       cin>>c;
    bestv=backknap(w,v,bestx,x,sw,sv,0);
    cout<<"装进背包的物品是:"<<endl;
    for(int j=0;j<n;j++)
       if(bestx[j]==1)
         cout<<j+1<<"  ";
    cout<<endl;
    cout<<"最大价值是:"<<bestv<<endl;
    return 0;
}
原文地址:https://www.cnblogs.com/aijianiula/p/2819411.html