01背包问题深度优先解法+列举出所有最佳方案,

废话不多说直接上代码

int n = 5;//物品数量
int V = 8;//背包最大重量
int w[100] = {3,5,1,2,2};//重量
int c[100] = {4,5,2,1,3};//价值
int tabTemp[10] = { 0 };//深度搜索过程中选择方案
int tab[10][10] = { 0 };//将当前方案保存,以便后面查看
int bingo = 0;//方案列表的索引
int maxValue = 0;//最大价值总和
void DFS(int index, int sumW, int sumC)
{
	if (index == n)
	{
		if (sumC >= maxValue)
		{
			//这一部分就是当有了更大的价值总和时,将方案列表的索引置0,覆盖之前价值总和最大时的方案,当sumC==maxValue时,意味着此时价值总和最大有第二套方案,bingo++
			if (sumC > maxValue)
				bingo = 0;
			else
			{
				bingo++;
			}

			//替换最大价值总和
			maxValue = sumC;

			//保存此时的选择方案
			for (int i = 0; i < n; i++)
			{
				tab[bingo][i] = tabTemp[i];
			}			
		}
		return;
	}

	tabTemp[index] = 0;
	DFS(index + 1, sumW, sumC);

	//剪枝,当选中当前物品时总重量不超过容积时才进入递归
	if (sumW + w[index]<=V) {
		tabTemp[index] = 1;
		DFS(index + 1, sumW + w[index], sumC + c[index]);
	}
}

int main()
{
	DFS(0, 0, 0);
	printf("%d\n", maxValue);
	for (int count = 0; count <= bingo; count++)
	{
		for (int i = 0; i < n; i++)
			printf("%d ", tab[count][i]);
		printf("\n");
	}
	return 0;
}

10
0 1 1 0 1
1 0 1 1 1

最大价值10,一共两种方案,
方案1:选第2,3,5个物品
方案2:选第1,3,4,5个物品

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值