1 /*#include<stdio.h>
2 #include<string.h>
3
4 int cur;
5 int a[20];
6
7 void fun(int n)//不重复递归,即0,1 递归
8 {
9 int i;
10 if(n==cur)
11 {
12 for(i=0;i<n;i++)
13 printf("%d",a[i]);
14 printf("\n");
15 return;
16 }
17 a[n]=0;
18 fun(n+1);
19
20 a[n]=1;
21 fun(n+1);
22 }
23
24 int main()
25 {
26 while(scanf("%d",&cur))
27 {
28 memset(a,0,sizeof(a));
29 fun(0);
30 }
31 return 0;
32 }*/
33
34
35
36 /*公司发了某商店的购物券1000元,限定只能购买店中的m种商品。每种商品的价格分别为m1,m2,…,要求程序列出所有的正好能消费完该购物券的不同购物方法。
37 程序输入:
38 重复递归*/
39 #include<stdio.h>
40 #include<string.h>
41
42 int m;
43 int price[1000];
44 int cur;
45 int count[1000];
46 int ans[1000][1000];
47 int sum;
48 int num;
49
50 void fun(int cur,int money)
51 {
52 int i;
53 if(sum==money)
54 {
55 for(i=0;i<m;i++)
56 ans[num][i]=count[i];
57 ++num;
58 return;
59 }
60 if(sum>money||cur>=m)
61 return;
62
63 sum+=price[cur];
64 count[cur]++;
65 fun(cur,money);
66
67 sum-=price[cur];
68 count[cur]--;
69 fun(cur+1,money);
70 }
71
72 int main()
73 {
74 int i,j;
75 while(scanf("%d",&m))
76 {
77 for(i=0;i<m;i++)
78 scanf("%d",&price[i]);
79 sum=num=0;
80 memset(ans,0,sizeof(ans));
81 memset(count,0,sizeof(count));
82 fun(0,1000);
83 printf("%d\n",num);
84 for(i=num-1;i>=0;i--)
85 {
86 for(j=0;j<m;j++)
87 printf("%d ",ans[i][j]);
88 printf("\n");
89 }
90 }
91 return 0;
92 }
93