小偷的背包 swustoj

小偷的背包
 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
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	{
		cin>>a[i];
	}
	if(fun(v,n-1))
	cout<<"yes!";
	else
	cout<<"no!";
	return 0;
} 

你可能感兴趣的:(swustoj)