1 /*
 2 公司发了某商店的购物券1000元,限定只能购买店中的m种商品。每种商品的价格分别为m1,m2,…,要求程序列出所有的正好能消费完该购物券的不同购物方法。
 3 
 4 
 5 整个问题的思路就是数学上的进制*/
 6 
 7 #include<stdio.h>
 8 #include<malloc.h>
 9 typedef struct Totalprice    // 结构体 
10 {
11     int price;  //单价
12     int count;   //数量
13     int max_value;   //最大个数
14 }totalprice;
15 
16 int m;
17 totalprice *unit;
18 
19 //先判断个位上的数 ,是否已满,若满的话。就要向十位的数进一个,(也要判断十位上的数是否也已满),一直到最后一位数达到最大值。
20 int panduan(int i)
21 {
22     if(((unit+i)->count>(unit+i)->max_value)&&(unit+m-1)->count<=(unit+m-1)->max_value)
23     {
24         (unit+i)->count=0;
25         ++(unit+(++i))->count;
26         panduan(i);
27     }
28     else
29         return;
30 }
31 
32 
33 void main()
34 {
35     int i,j=0;
36     int sum=0;
37     printf("请输入可购买的商品种类:");
38     scanf("%d",&m);
39     //动态的申请内存空间
40     unit=(totalprice *)malloc(sizeof(totalprice)*m);
41 
42     //初始化数据
43     for(i=0;i<m;i++)
44     {
45         scanf("%d",&(unit+i)->price);
46         (unit+i)->count=0;
47         (unit+i)->max_value = 1000/(unit+i)->price;
48     }
49     printf("\n");
50     for(i=0;i<m;i++)
51     {
52         printf("price=%d  ",(unit+i)->price);
53         printf("max_value=%d\n",(unit+i)->max_value);
54     }
55 
56     //操作
57     while((unit+m-1)->count<=(unit+m-1)->max_value)
58     {
59         ++(unit)->count;
60         panduan(0);
61         for(i=0;i<m;i++)   // 将每个方案 计算总价 ,然后与1000相比较
62             sum+=(unit+i)->price*(unit+i)->count;
63         if(sum == 1000)
64         {
65             for(i=0;i<m;i++)
66                 printf("%5d",(unit+i)->count);
67             printf("\n"),j++;
68         }
69         else
70             sum = 0;
71     }
72     printf("\n总共方案: %d\n",j);
73     getch();
74 }

 

posted on 2012-08-04 21:41  新猪先生  阅读(238)  评论(0编辑  收藏  举报