963: 小偷的背包
题目描述
设有一个背包可以放入的物品重量为S,现有n件物品,重量分别是w1,w2,w3,…,wn。问能否从这n件物品中选择若干件放入背包中,使得放入的重量之和正好为S。如果有满足条件的选择,则此背包有解,否则此背包问题无解。
输入
第一行为物品重量S(整数);
第二行为物品数量n,
第三行为n件物品的重量的序列。
输出
有解就输出”yes!“,没有解就输出”no!“。
样例输入
20
5
1 3 5 7 9
样例输出
yes!
思路:枚举所有的情况,当s<W时向背包中装物品,s>W时回溯继续循环。
#include<iostream>
using namespace std;
# define size 50
int s=0,i=0,cg=0,w[size];
void match(int W,int n,int s,int i)
{
if(s==W)
{
cg=1;
return ;
}
else if(s>W) return; //回溯
else
{
for(i;i<n;i++)
{
match(W,n,s+w[i],i+1); //继续递归调用装入物品
}
}
}
int main()
{
int W,num;
cin >> W >> num;
for(int j=0;j<num;j++)
cin >> w[j];
match(W,num,s,i);
if(cg==1)
cout << "yes!";
else cout << "no!";
return 0;
}