01背包问题未改进版本

辛苦我们聪明的漂亮的小王同学的修改,才得以运行成功,现在将代码附上,具体的算法分析请参考《算法分析与设计》 清华大学出版社

#include <iostream>

using namespace std;

class Init
{
 public :
     //用于后面判断
    int Max(int a,int b)
     {
         return a>b?a:b;
     }

     void inputW(int w[],int n)
     {
         cout<<"请输入每个物品的重量\n";
         for(int i=0;i<n;i++)
            cin>>w[i];
     }

     void inputV(int v[],int n)
     {
         cout<<"请输入每个物品的价值\n";

         for(int i=0;i<n;i++)
            cin>>v[i];

     }

     //n用于表示物质的个数  W表示背包所能装下的物体的总的重量
     //w[]用于存放每个物品的重量  v[]用于存放每个物品的价值
     int KnapSack(int n,int W,int w[],int v[],int x[])
     {
        int j,C[n+1][W+1];

        //初始化第0列
        for(int i=0;i<=n;i++)
        {
            C[i][0]=0;

        }

        //初始化第0行
        for( int i=0;i<=W;i++)
        {
          C[0][i]=0;
        }
      /*  cout<<"每个物品的重量\n";
         for(int i=0;i<n;i++)
            cout<<w[i]<<"  ";

        cout<<endl;
        cout<<"请输入每个物品的价值\n";

         for(int i=0;i<n;i++)
            cout<<v[i]<<"  ";

        cout<<endl;

        for(int i=0;i<n;i++)
            cout<<x[i]<<"  ";
        cout<<endl;
    */
        for(int i=1;i<=n;i++)

          for(j=1;j<=W;j++)
          //由于w[]数组的下标是从0开始的所以,这个地方下标要为才可以i-1
               if(j<w[i-1])
                 C[i][j]=C[i-1][j];
              else
              //同样的道理对于w[]数组和v[]数组的下标,第一个元素都要从i-1开始才可以
                 C[i][j] = Max(C[i-1][j],C[i-1][j-w[i-1]]+v[i-1]);

         j=W;
         for(int i=n;i>0;i--)
                if(C[i][j]>C[i-1][j])
                   {
                       x[i-1]=1;
                       j-=w[i-1];

                   }
                   else
                   {
                       x[i-1]=0;
                   }
             return C[n][W];

     }
};


int main()
{


   int n;
   int W;
   int w[100];
   int v[100];
   int x[10];


   cout<<"请输人物品的数量"<<endl;
   cin>>n;
    for(int i=0;i<n;i++)
     {
       x[i]=0;
     }

    cout<<"请输入背包的总容量"<<endl;
    cin>>W;

    Init a;
    a.inputW(w,n);
    a.inputV(v,n);
    a.KnapSack(n,W,w,v,x);


   for(int i=0;i<n;i++)
   {
       cout<<x[i]<<"  ";
   }

    return 0;
}





这里写图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值