1 /* 2 公司发了某商店的购物券1000元,限定只能购买店中的m种商品。每种商品的价格分别为m1,m2,…,要求程序列出所有的正好能消费完该购物券的不同购物方法。 3 4 5 整个问题的思路就是数学上的进制*/ 6 7 #include8 #include 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 else29 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 price);46 (unit+i)->count=0;47 (unit+i)->max_value = 1000/(unit+i)->price;48 }49 printf("\n");50 for(i=0;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 price*(unit+i)->count;63 if(sum == 1000)64 {65 for(i=0;i count);67 printf("\n"),j++;68 }69 else70 sum = 0;71 }72 printf("\n总共方案: %d\n",j);73 getch();74 }