时间限制:1秒
空间限制:32768K
输入描述:
输入包括两行 第一行为两个正整数n和w(1 <= n <= 30, 1 <= w <= 2 * 10^9),表示零食的数量和背包的容量。 第二行n个正整数v[i](0 <= v[i] <= 10^9),表示每袋零食的体积。
输出描述:
输出一个正整数, 表示牛牛一共有多少种零食放法。
输入例子1:
3 10 1 2 4
输出例子1:
8
例子说明1:
三种零食总体积小于10,于是每种零食有放入和不放入两种情况,一共有2*2*2 = 8种情况。
#include<iostream>
using namespace std;
#include<vector>
#include<algorithm>
#include<math.h>
#include<iomanip>
struct map1{
long long value;
long long key;
};
vector<map1>::const_iterator find_val(vector<map1>::const_iterator beg,//vector首地址
vector<map1>::const_iterator end,//vector末地址
map1 Point)//要查找的point变量
{
vector<map1>::const_iterator iter = end;
for (; beg != end; beg++)
{
if ((*beg).value == Point.value && (*beg).key == Point.key)
{
iter = beg;
return iter;
}
}
return iter;
}
int main(){
long long n, w;
long long sum=0;
cin >> n >> w;
int *v=new int[n];
for (int i = 0; i < n; i++){
cin >> v[i];
sum = sum + v[i];
}
if (sum <= w){
cout << setprecision(12)<<pow(2, n);
}
else{
map1 fir;
fir.value = 0;
fir.key = 0;
vector<map1> vec1;
vec1.push_back(fir);
vector<map1>::const_iterator it;
for (int i = 0; i < n; i++){
long long q = vec1.size();
for (int j = 0; j < q; j++){
map1 c;
c.value = vec1[j].value + v[i];
c.key = vec1[j].value - v[i];
if (c.value <= w){
it = find_val(vec1.begin(), vec1.end(), c);
if (it == vec1.end()){
vec1.push_back(c);
}
}
}
}
cout << vec1.size();
}
delete[]v;
return 0;
}