蛮力算法——0-1背包问题(C++实现)

蛮力算法——0-1背包问题(C++实现)

基本思想:
对于有n种可选物品的0/1背包问题,其解空间由长度为n的0-1向量组成,可用子集数表示。在搜索解空间树时,深度优先遍历,搜索每一个结点,无论是否可能产生最优解,都遍历至叶子结点,记录每次得到的装入总价值,然后记录遍历过的最大价值。
问题描述:
背包问题分为两种,一种是可分割背包,就是我们平常所说的背包问题,可以将物品的一部分放入背包中。另一种就是0-1背包问题。在此问题中的物品只有两种选择,要么全部放入(1),要么不放(0)。接下来使用蛮力算法来实现0-1背包问题。

#include<iostream>
#define N 50
using namespace std;
int n,bestValue,cv,cw,c;//物品数量,最大价值,当前价值,当前重量,背包容量 
int x[N],cx[N];//最终存储状态,当前存储状态 
struct goods
{
	int weight;//物品重量
	int value;//物品价值 
};
struct goods goods[N];
int knapstack(int i){
	if(i>n-1)
	{
		if(bestValue<cv&&cw<=c)
		{
			for (int k=0;k<n;k++)
			x[k]=cx[k];//存储最优路径
			bestValue=cv; 
		}
		return bestValue;
	}
	cw=cw+goods[i].weight;
	cv=cv+goods[i].value;
	cx[i]=1;
	knapstack(i+1);
	cw=cw-goods[i].weight;
	cv=cv-goods[i].value;
	cx[i]=0;
	knapstack(i+1);
	return bestValue;
} 
int main()
{
cout<<"请输入物品的个数:";
cin>>n;
cout<<"请输入背包的容量:";
cin>>c;
cout<<"请依次输入物品的重量";
for(int i=0;i<n;i++)
{
	cin>>goods[i].weight;
 } 
cout<<"请依次输入物品的价值";
for(int i=0;i<n;i++)
{
	cin>>goods[i].value; 
 }	
cout<<"最大价值为:"<<knapstack(0)<<endl;
cout<<"最优装入方案:";
for(int i=0;i<n;i++)
{
	cout<<x[i]<<"  ";
}
return 0; 
}

运行结果

在这里插入图片描述
采用蛮力算法实现0-1背包问题,并不是最优的算法。一般并不会使用蛮力算法来实现0-1背包问题。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值