思路:
本题的背包容量较大,而物品的数量较少,所以不适合采用动态规划的解法。
于是我们可以使用dfs的方法,也就是枚举,每一种物品都有选与不选两种选择。
代码如下:
#include<stdio.h>
#include<iostream>
#include<vector>
#include<math.h>
#define INF 0x3f3f3f3f
using namespace std;
long ans=0;//总方法数
int n;//n个物品
long w;//w为背包容量
vector<long> value;//物品的重量
void dfs(long sum,int loc){
if(sum>w) return;//若不能再装
if(sum<=w){//若仍然可以再装
++ans;
}
for(int i=loc;i<n;++i){
dfs(sum+value[i],i+1);
}
}
int main(){
cin>>n>>w;
long total=0;
for(int i=0;i<n;++i){
int b;
cin>>b;
value.push_back(b);
total+=value[i];
}
if(total<=w){//若n个物品的总重量都小于w,则有2的n次方种方法
ans=pow(2,n);
}else{
sort(value.begin(),value.end());
dfs(0,0);
}
cout<<ans<<endl;
return 0;
}