链接:https://www.nowcoder.com/questionTerminal/bf877f837467488692be703735db84e6
来源:牛客网
牛牛准备参加学校组织的春游, 出发前牛牛准备往背包里装入一些零食, 牛牛的背包容量为w。
牛牛家里一共有n袋零食, 第i袋零食体积为v[i]。
牛牛想知道在总体积不超过背包容量的情况下,他一共有多少种零食放法(总体积为0也算一种放法)。
输入描述:
输入包括两行 第一行为两个正整数n和w(1 <= n <= 30, 1 <= w <= 2 * 10^9),表示零食的数量和背包的容量。 第二行n个正整数v[i](0 <= v[i] <= 10^9),表示每袋零食的体积。
输出描述:
输出一个正整数, 表示牛牛一共有多少种零食放法。
示例1
输入
3 10 1 2 4
输出
8
说明
三种零食总体积小于10,于是每种零食有放入和不放入两种情况,一共有2*2*2 = 8种情况。
#include<iostream>
#include<cmath>
#include<vector>
using namespace std;
typedef long long ll;
ll n,w;///n件零食,总容量
ll ans = 0;///结果
vector<ll>value;///零食体积
void dfs(ll sum, ll t)///当前收纳零食体积,当前零食下标
{
if(sum>w)return ;///超过总容量==上一个零食不能放入
else ans++;///该零食能放入,可为一种方案
///对该方案所有可能的后继情况搜索
for(ll i = t; i < n; i++)dfs(sum+value[i],i+1);
}
int main()
{
ll t;
ll sum = 0;
///输入
cin>>n>>w;
for(ll i=1;i<=n;i++)
{
cin>>t;
value.push_back(t);
sum+=t;
}
///当所有零食总体积小于背包体积的时候不难得出结果为2^n
if(sum<=w)ans = pow(2,n);
else {
dfs(0,0);
}
cout<<ans<<endl;
return 0;
}