C++ 01揹包

using namespace std;

using name

#include<iostream>

usingnamespace std;

voidknapsack(int v[],int w[],int c,int *m[],int n){

       int jMax=min(w[n]-1,c);

       for(int j=0;j<=jMax;j++){

              m[n][j]=0;

       }

       for(int j=w[n];j<=c;j++){

              m[n][j]=v[n];

       }//首先计算第n个物品的最优解

       for(int i=n-1;i>1;i–){

              jMax=min(w[i]-1,c);

              for(int j=0;j<=jMax;j++){

                     m[i][j]=m[i+1][j];

              }

              for(int j=w[i];j<=c;j++){

                     m[i][j]=max(m[i+1][j],m[i+1][j-w[i]]+v[i]);

              }

       }//再计算第2个到第n-1个物品的最有

 

       m[1][c]=m[2][c];

       if(c>=w[1]) {

              m[1][c]=max(m[1][c],m[2][c-w[1]]+v[1]);

       }//最后求第1个物品的最优解

 

}

voidtraceback(int *m[],int w[],int c,int x[],int n){

       for(int i=1;i<n;i++){

              if(m[i][c]==m[i+1][c]) x[i]=0;

              else{

                     x[i]=1;

                     c-=w[i];

              }

              x[n]=m[n][c]>0? 1:0;

       }

}//用1/0表示物品有没有被使用

intmain(){

       cout<<“首先请输入揹包容量C:”<<endl;

       int c;

       cin>>c;

       cout<<“再输入物品数量N:”<<endl;

       int n;cin>>n;

       cout<<“按照物品的顺序依次输入每个物品的重量和价值:”<<endl;

       int *w=new int[n+1];

       int *v=new int[n+1];

       for(int i=1;i<=n;i++){

              cin>>w[i];

              cin>>v[i];

       }//以上全为输入

       int *x=new int [n+1];//x[i]表示第i个物品有没有被使用

       int **m=new int*[n+1];

       for(int i=0;i<n+1;i++){

              m[i]=new int[c+1];

       }//定义二维数组m[i][j]

 

       knapsack(v,w,c,m,n);

       traceback(m,w,c,x,n);

       for(int i=1;i<=n;i++){

              if(x[i]==1)

              cout<<“第”<<i<<“个物品被使用了”<<endl;

       }//输出结果

      

       cout<<endl;

       system(“pause”);

       return 0;

}

点赞