描述
设有一个背包可以放入的物品重量为S,现有n件物品,重量分别是w1,w2,w3,...,wn。问能否从这n件物品中选择若干件放入背包中,使得放入的重量之和正好为S。如果有满足条件的选择,则此背包有解,否则此背包问题无解。
input
第一行为物品重量S(整数);
第二行为物品数量n,
第三行为n件物品的重量的序列。
output
有解就输出”yes!“,没有解就输出”no!“
样例输入
20
5
1 3 5 7 9
样例输出
yes!
这道题我是通过递归的方式做的,如果最后一次恰好刚好装满则返回1,然后s减掉wn,如果没有则检查wn-1,s不变,最后通过递归返回到开始第一个。
我的代码如下
1 #include<stdio.h> 2 3 int bagWeight[50]; 4 5 int bag(int s,int n) 6 { 7 if(s==0) 8 { 9 return 1; 10 } 11 if(s<0||s>0&&n==0) 12 { 13 return 0; 14 } 15 if(bag(s-bagWeight[n],n-1)==1) 16 { 17 return 1; 18 } 19 return bag(s,n-1); 20 } 21 22 int main() 23 { 24 int s; 25 int n; 26 int i; 27 int flag; 28 29 while(scanf("%d%d",&s,&n)!=EOF) 30 { 31 for(i=1; i<=n; i++) 32 { 33 scanf("%d",&bagWeight[i]); 34 } 35 36 flag=bag(s,n); 37 if(flag==1) 38 { 39 printf("yes!"); 40 } 41 else 42 { 43 printf("no!"); 44 } 45 } 46 47 return 0; 48 }