#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);