小偷的背包
1000(ms)
10000(kb)
2422 / 6485
设有一个背包可以放入的物品重量为S,现有n件物品,重量分别是w1,w2,w3,...,wn。问能否从这n件物品中选择若干件放入背包中,使得放入的重量之和正好为S。如果有满足条件的选择,则此背包有解,否则此背包问题无解。
输入
第一行为物品重量S(整数); 第二行为物品数量n, 第三行为n件物品的重量的序列。
输出
有解就输出”yes!“,没有解就输出”no!“。
样例输入
20 5 1 3 5 7 9
样例输出
yes!
#include<iostream> using namespace std; int a[55]; bool fun(int v,int n) { if(v==0) return 1;//包刚刚装满,返回1 if(v<0||v>0&&n<0) return 0;//包不能刚刚装满,返回0 if(fun(v-a[n],n-1)) return 1;//不断的递归 return fun(v,n-1);//如果第一个开始不能装满,就从第二个开始 } int main() { int v,n; cin>>v>>n; for(int i=0;i<n;i++) { cin>>a[i]; } if(fun(v,n-1)) cout<<"yes!"; else cout<<"no!"; return 0; }