⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 bag.cpp

📁 在0 / 1背包问题中
💻 CPP
字号:
#include <stdio.h>
void readdata();
void search(int);
void checkmax();
void printresult();
int c, n;        //c: 背包容量;n:物品数
int w[100], v[100];       //w[i]、v[i]:第i件物品的重量和价值
int a[100];        //a数组存放当前解各物品选取情况
//a[i]=0表示不选第i件物品,a[i]=1表示选第i件物品
int sum_value=0;//当前总价值
int sum_weight=0;//当前总重量
int best_value=-1;//记录最大价值
int best_bag[100];//记录最优选择的包
int main()
{
	readdata();       //读入数据
	search(0);        //递归搜索
	printresult();
}

void search(int m)
{
	if(m>=n)
		checkmax();   //检查当前解是否是可行解,若是则把它的价值与max比较
	else
	{
		if((sum_weight+w[m])<=c){
	sum_weight+=w[m];
	sum_value+=v[m];
	a[m]=1;       //不选第m件物品
	search(m+1);  //递归搜索下一件物品
	sum_weight-=w[m];
	sum_value-=v[m];
	}
	a[m]=0;       //选第m件物品
	search(m+1);  //递归搜索下一件物品
}
}


void checkmax()
{	                  
	if(sum_value>best_value)  {            //价值大于max
		best_value=sum_value;            //替换max
		for(int i=0;i<n;i++){
best_bag[i]=a[i];

		}
	}

}
void readdata()

{printf("输入物品数");
scanf("%d",&n);
printf("输入背包容量");
scanf("%d",&c);
printf("输入物品的重量和价值");
int i;
for(i=0;i<n;i++)
scanf("%d%d",&w[i],&v[i]);   //读入第i件物品重量和价值
}
void printresult()
{
			printf("选择的背包为");
	for(int i=0;i<n;i++){
		if(1==best_bag[i])
			printf("%d ",i+1);
		
		}

	printf("\n最大价值%d",best_value);
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -