0-1背包问题

输入样例

输出样例

50 3

10 60

30 120

20 100

0

220

 

 

完整程序:

#include<bits/stdc++.h>
using namespace std;
// 0-1背包问题回溯算法实现
//(1) 0-1背包问题回溯算法的数据结构
#define NUM 100
int c;				//背包的容量
int n;				//物品的数量
int cw;				//当前重量
int cv;				//当前价值
int bestv;			//当前最优价值
//描述每个物品的数据结构
struct Object{
	int w;			//物品的重量
	int v;			//物品的价值
	double d;		//物品的单位重量价值比
}Q[NUM];			//物品的数组
//对物品以单位重量价值比递减排序的因子是:
bool cmp(Object a, Object b)
{
	if(a.d>=b.d) return true;
	else return false;
}
//(3)限界函数Bound()的实现
//形参i是回溯的深度
int Bound(int i)
{
int cleft=c-cw;//背包剩余的容量
int b=cv;//上界
//尽量装满背包
while(i<n&&Q[i].w<=cleft)
{
cleft-=Q[i].w;
b+=Q[i].v;
i++;
}
//剩余的部分空间也装满
if(i<n)b+=1.0*cleft*Q[i].v/Q[i].w;
return b;
}
//(2) 0-1背包问题回溯算法的实现
//形参i是回溯的深度,从0开始
void backtrack(int i)
{
//到达叶子结点时,更新最优值
if(i+1>n){bestv=cv;return;}
//进入左子树搜索
if(cw+Q[i].w<=c)
{
cw+=Q[i].w;
cv+=Q[i].v;
backtrack(i+1);
cw-=Q[i].w;
cv-=Q[i].v;
}
//进入右子树搜索
if(Bound(i+1)>bestv)backtrack(i+1);
}
int main(){
    cout<<"请输入背包的容量和物品的数量"<<endl;
    cin>>c;
    while(c){
            cin>>n;
    cout<<"请依次输入物品的重量和价值"<<endl;
    //物品的单位重量价值比是在输入数据时计算的:
for(int i=0; i<n; i++)
{
	scanf("%d%d",&Q[i].w,&Q[i].v);
	Q[i].d = 1.0*Q[i].v/Q[i].w;
}
//使用C++标准模板库的排序函数sort()排序:
sort(Q,Q+n,cmp);
backtrack(0);
cout<<"装入背包中物品的最大价值为:"<<endl;
cout<<bestv<<endl;
 cout<<"请输入背包的容量和物品的数量"<<endl;
    cin>>c;
    }
return 0;
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Famiglistimott

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值