回溯算法——0-1背包

北城以北 提交于 2019-11-28 17:57:59

回溯算法的思想:每到一个十字路口A,就选择一条路走a,如果a走不通,则回到十字路口A,选择其他bcd之一,进行走。若依然走不通,则退回到A之前的十字路口,重复上面的操作。

利用回溯算法解决的经典问题:数独、八皇后、0-1背包、图的着色、旅行商问题、全排列等等。

0-1背包问题

#include<iostream>
#define MAX_WEIGHT 100
using namespace std;


// arr 待装包的物品重量,
// curweight 当前i物品的重量
// i 当前即将放入的i物品
// num 可用物品的数量
// bagweight 当前背包的总重量
void fill(int *arr, int curweight, int i, int num, int &bagweight)
{
	if(curweight == MAX_WEIGHT || i == num)	// 装满,或者考察完所有物品
	{
		if(curweight > bagweight)
		{
			bagweight = curweight;		// 记录历史最大装载量
		//	cout << bagweight << "***" << endl << endl;
		}
		return;
	}
	fill(arr, curweight, i + 1, num, bagweight);	// 不选择i物品
	if(curweight + arr[i] <= MAX_WEIGHT)	// 选择当前i物品, curweight更新
	{
		fill(arr, curweight + arr[i], i + 1, num, bagweight);
		//cout << bagweight << "---" << endl;
	}
}


int main()
{
	int a[10] = {50, 45, 43, 33, 30, 29, 27, 26, 25, 15};
        int b[10] = {54, 45, 43, 39, 36, 31, 28, 22, 16, 14};

	int bagweight = 0;
	fill(a, 0, 0, 10, bagweight);
	cout << "a包内的物品: " << bagweight<< endl;

	bagweight = 0;
	fill(b, 0, 0, 10, bagweight);
	cout << "b包内的物品: " << bagweight << endl;
	return 0;
}

// 尝试打印输出装包过程,但是没看明白

 

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!