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 }