栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

回溯算法解决问题(C语言)

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

回溯算法解决问题(C语言)

文章目录
  • 前言
  • 一、实验步骤及结果
  • 总结


前言

解决问题:
通过回溯算法设计背包问题:
有n个重量分别为{w1,w2,…,wn}的物品,它们的价值分别为{v1,v2,…,vn},给定一个容量为W的背包。设计从这些物品中选取一部分物品放入该背包的方案,每个物品要么选中要么不选中,要求选中的物品不仅能够放到背包中,而且具有最大的价值。
对下表所示的4个物品求出W=6时的所有解和最佳解。


一、实验步骤及结果
#include
int weight[100];
int value[100];
int n,max_weight,max_value;
 
int best[100],tree[100];
void x(){
	printf("--------------------------------------------n");
}
 
void s()
{
	int i,j,k,l;
	x();
	printf("所能选的最大价值是%dn",max_value);
	printf("最佳选填方案为: ");
	for(i=1;i<=n;i++){
		if(best[i]==1)
			printf("t选择第%d个",i);
		    printf("n");
	}}
 
void foolish(int length,int allweight,int allvalue)
{
	if(length>=n+1)
	{
		if(allvalue>max_value)
		{
			int i;
			max_value = allvalue;
			for(i=1;i<=n;i++)
				best[i] = tree[i];
		}
	}
	else
	{
		if(allweight>=weight[length+1])
		{
			allweight = allweight - weight[length+1];
			allvalue = allvalue + value[length+1];
			tree[length+1] = 1;
			foolish(length+1,allweight,allvalue);
			tree[length+1] = 0;
			allweight = allweight + weight[length+1];
			allvalue = allvalue - value[length+1];
		}
		foolish(length+1,allweight,allvalue);
	}
}
 
void init()
{
	int i;
	max_value = 0;
	for(i=1;i<=n;i++)
		tree[i] = 0;
}
 
void main()
{
	int i,j,k,l;
	x();
	printf("请输入物品数量: ");
	scanf("%d",&n);
	printf("请输入背包容量: ");
	scanf("%d",&max_weight);
	x();
	{
		for(i=1;i<=n;i++)
			{printf("请输入第%d个物品质量: ",i);
		scanf("%d",&weight[i]);}
		x();
		for(j=1;j<=n;j++)
			{printf("请输入第%d个物品价值: ",j);
		scanf("%d",&value[j]);}
		init();
		foolish(0,max_weight,0);
		s();
		}
}

实验结果:


总结

本次实验的难点在于如何剪枝,刚开始的我仅仅只使用了剪枝而没有回溯导致显示结果不正常,emmm回溯小难需要自己花心思学。

暑期编程PK赛 得CSDN机械键盘等精美礼品!
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/1015460.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号