c编程
编程设计:
公司发了购物券1000元,限定只能购买m种商品,每种商品的价格分别为m1,m2.......,要求程序列出所有的正好能消费完购物券的不同购物方法。
程序输入:第一行是一个整数m,代表商品的种数。接下来是m个整数,每一行,分别代表这m种商品的单价。
输出程序:第一行是一个整数,表示共有多少种方案,第二行开始,每一种方案占一行,表示对每种商品购买的数量,中间用空格分隔。
输入:
2
200
300
则输出:
2
2 2
5 0
[解决办法]
- C/C++ code
#include<stdio.h>#include<stdlib.h>int *a,*b;int n;int count = 0;void print(){ int i; for(i = 0; i < n; i++) printf("%d ",b[i]); printf("\n");}void problem9(int total,int size){ if(size != n ) { if(total == 0)//判断背包是否正装满 { count++;//存放可行方案的个数 print();//输出此可行解 } else { problem9(total,size + 1);//未放入物品a【size】的情况 if(total - a[size] >= 0)//判断放入a【size】后,是否会超出背包的承载 { b[size]++; //使得a【size】对应物品的数量加1 problem9(total - a[size],size); //放入物品a[size]的情况 b[size]--; //使得相应的物品数量减1 } } }}void main(){ int i,j; scanf("%d",&n); a = (int*)malloc(sizeof(int) * n); b = (int*)malloc(sizeof(int) * n); for(i = 0; i < n; i++) scanf("%d",&a[i]); for(j = 0; j < n; j++) b[j] = 0; problem9(1000,0); printf("%d",count);}
[解决办法]
- C/C++ code
#include<stdio.h>#include<stdlib.h>int *a,*b[50];int n;int count = 0;void print(){ int i,j; for(j = 0; j < count; j++) { for(i = 0; i < n; i++) printf("%d ",b[j][i]); printf("\n"); }}void problem9(int total,int size){ int j; if(size != n ) { if(total == 0)//判断背包是否正装满 { count++;//存放可行方案的个数 b[count] = (int*)malloc(sizeof(int) * n); for(j = 0; j < n; j++) b[count][j] = b[count-1][j]; } else { problem9(total,size + 1);//未放入物品a【size】的情况 if(total - a[size] >= 0)//判断放入a【size】后,是否会超出背包的承载 { b[count][size]++; //使得a【size】对应物品的数量加1 problem9(total - a[size],size); //放入物品a[size]的情况 b[count][size]--; //使得相应的物品数量减1 } } }}void main(){ int i,j; scanf("%d",&n); a = (int*)malloc(sizeof(int) * n); b[count] = (int*)malloc(sizeof(int) * n); for(i = 0; i < n; i++) scanf("%d",&a[i]); for(j = 0; j < n; j++) b[count][j] = 0; problem9(1000,0); printf("%d\n",count); print();//输出此可行解}
[解决办法]