1000元购物卷买票

公司发了某商店的购物券1000元,限定只能购买店中的m种商品。每种商品的价格分别为m1,m2,…,要求程序列出所有的正好能消费完该购物券的不同购物方法。

程序输入:
第一行是一个整数m,代表可购买的商品的种类数。
接下来是m个整数,每个1行,分别代表这m种商品的单价(0<m<1000)。
程序输出:
    第一行是一个整数,表示共有多少种方案
    第二行开始,每种方案占1行,表示对每种商品购买的数量,中间用空格分隔。
例如:

输入:
2
200
300
则应输出:
2
2  2
5  0

输入:
2
500
800
则应输出:
1
2  0

输入:
1
999
则应输出:
0

多个方案间的顺序不重要。

 1 #include<stdio.h>
 2 #include<malloc.h>
 3 int main()
 4 {
 5     int m,sum;
 6     scanf("%d",&m);//m种商品
 7     int *p=(int*)malloc(sizeof(int)*m);//存储价格
 8     int *i=(int*)malloc(sizeof(int)*m);//存放方案
 9     int *max=(int*)malloc(sizeof(int)*m);
10     int count=0;//记录方案总数
11     for(int j=0;j<m;j++)
12     {
13         i[j]=0;//初始化方案数
14         scanf("%d",p+j);
15         max[j]=1000/p[j];
16     }
17     while(i[0]<=max[0]) 
18     {
19         for(int j=m-1;j>=0;j--)
20         {
21             i[j]++;
22             if(i[j]>max[j]&&j) i[j]=0;
23             else break;
24         }
25         sum=0;
26         for(int j=0;j<m;j++) sum+=p[j]*i[j];//计算 
27         if(sum==1000)
28         {
29             count++;
30             for(int j=0;j<m;j++) printf("%-4d",i[j]);
31             putchar('\n');
32         }
33     }
34     printf("总共有 %d 方案\n",count);
35     system("pause");
36     return 0;
37 }

posted @ 2013-05-03 07:25  浪浪辛  阅读(284)  评论(0)    收藏  举报