0-1背包

/*问题描述:有 N 件物品 d1,......dN,每件物品重量为 W1,..., WN
 (Wi > 0), 每件物品价值为 V1,......VN (Vi>0)。用这N件物品的某个子集
 填空背包,使得所取物品的总重量<=TOTAL,并设法使得背包中物品的价值尽可
 能高。

*/ 

//0-1背包问题..,物品不可分割;可分割物品的背包问题可采用贪心算法。

  1. #include<iostream>
  2. using namespace std;
  3. #define N 5 //N件物品
  4. bool RSet[N],Set[N];
  5. float W[N],V[N],TOTAL,VALUE;
  6. int main(){
  7.  void Process(int n,float Sum,float Total_Value);
  8.  bool Set[N];
  9.  cout<<"请输入这"<<N<<" 件物品的重量(>0)!"<<endl;
  10.     for(int i=0;i<N;i++)cin>>W[i];
  11.  cout<<"请输入这"<<N<<" 件物品的价值(>0)!"<<endl;
  12.  for(i=0;i<N;i++)cin>>V[i];
  13.  cout<<"请输入背包的背重!"<<endl;
  14.  cin>>TOTAL;
  15.     for(i=0;i<N;i++){/*初始化*/
  16.   Set[i]=false;
  17.   RSet[i]=false;
  18.  }
  19.  VALUE=0;
  20.     Process(0,0,0);
  21.  cout<<"装入背包的物品为:"<<endl;
  22.  for(i=0;i<N;i++)if(RSet[i])cout<<i+1<<endl;
  23.  return 0;
  24. }
  25. void Process(int n,float Sum,float Total_Value){
  26.  if(n==N){
  27.   if(Total_Value>VALUE){
  28.    for(int i=0;i<N;i++)RSet[i]=Set[i];//记录此次装载情况
  29.    VALUE=Total_Value;
  30.   }
  31.   return ;
  32.  }
  33.  else {
  34.   if(Sum+W[n]<=TOTAL){
  35.    Set[n]=true;//加入
  36.    Process(n+1,Sum+W[n],Total_Value+V[n]);
  37.    Set[n]=false;
  38.    Process(n+1,Sum,Total_Value);
  39.   }
  40.   else {
  41.    Process(n+1,Sum,Total_Value);
  42.   }
  43.  }
  44. }

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值