牛牛的背包问题(网易(DFS))

在这里插入图片描述

#include<iostream>
#include<vector>
#include<cmath>
using namespace std;
typedef long long LL;
void DFS(LL sum, int cur, int n, vector<LL>&v, LL w, int &count)
{
	if (cur < n)//当前是第cur袋零食
	{

		//不添加这件零食
		DFS(sum, cur + 1, n, v, w, count);
		//如果可以添加这件零食
		if (sum + v[cur] <= w)
		{
			count++;
			DFS(sum + v[cur], cur + 1, n, v, w, count);
		}


	}
}
int main()
{
	int n;
	LL w;
	cin >> n >> w;//n个零食,背包大小为w
	vector<LL>v(n);
	LL total = 0;
	for (int i = 0; i < n; i++)
	{
		cin >> v[i];
		total += v[i];
	}
	if (total <= w)
		cout << (LL)pow(2, n) << endl;
	else
	{
		int count = 0;

		DFS(0, 0, n, v, w, count);
		cout << count + 1 << endl;//一个零食都不装也要考虑,所以+1
	}

	system("pause");
	return 0;
}

继续优化:将零食按体积升序排列,这样可以适当地剪枝。

sort(v.begin(), v.end());
DFS(0, 0, n, v, w, count);
发布了212 篇原创文章 · 获赞 4 · 访问量 8803

猜你喜欢

转载自blog.csdn.net/ShenHang_/article/details/104538733