01背包问题

代码:

// n=5, c=10, w={2, 2, 6, 5, 4}, v={6, 3, 5, 4, 6}的0-1背包问题的最优解和最优值。
#include <iostream>
using namespace std;
 
#define N 10
int w[N];//重量
int v[N];//价值
int x[N];//1表放入背包,0表不放入
int n,c;//n:物品个数 c:背包的最大容量
 
int cw=0;//当前物品总重
int cv=0;//当前物品总价值
 
int bestp=0;//当前最大价值
int bestx[N];//最优解
 
//回溯函数 k表示当前处在第几层做选择,k=1时表示决定是否将第一个物品放入背包
void backtrack(int k)
{//叶子节点,输出结果
   if(k>n){//找到一个更优的解
     if(cv>bestp){//保存更优的值和解
        bestp = cv;
        for(int i=1; i<=n; i++)
            bestx[i] = x[i];
        }
    }
   else{//遍历当前节点的子节点
     for(int i=0; i<=1; i++){
        x[k]=i;
        if(i==0){
            backtrack(k+1);
        }
        else{//约束条件:当前物品是否放的下
           if((cw+w[k])<=c){
             cw += w[k];
             cv += v[k];
             backtrack(k+1);
             cw -= w[k];
             cv -= v[k];
           }
        }
     }
  }
}
 
int main()
{
 	cout<<"请输入背包的容量:";
    cin>>c;
    cout<<"请输入物品的个数(注意:不能超过100个!):";
    cin>>n;
    cout<<"请输入每个物品的重量及价值:"<<endl;
    for(int i=1;i<=n;i++)
    
    {
    	cout<<"请输入第"<<i<<"个物品的重量: ";
		 
        cin>>w[i];
        cout<<"请输入第"<<i<<"个物品的价值: ";
        cin>>v[i];
        cout<<endl;
    }
    
    backtrack(1);
    cout<<bestp<<endl;
    cout<<"被选中的物品总价值为 "<<bestp<<endl;
    
    for(int i=1;i<=n;i++)
        //cout<<bestx[i]<<" ";
        if (bestx[i]==1){
        	cout<<"第"<<i<<"个物品被选中"<<endl; 
        }
    
    return 0;
}

运行结果:

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值