公司发了某商店的购物券1000元,限定只能购买店中的m种商品。每种商品的价格分别为m1,m2,…,要求程序列出所有的正好能消费完该购物券的不同购物方法。 程序输入: 第一行是一个整数m,代表可购买的商品的种类数。 接下来是m个整数,每个1行,分别代表这m种商品的单价。 程序输出: 第一行是一个整数,表示共有多少种方案 第二行开始,每种方案占1行,表示对每种商品购买的数量,中间用空格分隔。
例如:
输入: 2 200 300
则应输出: 2 2 2 5 0
输入: 2 500 800
则应输出: 1 2 0
1 #include <iostream> 2 #include <cstring> 3 using namespace std; 4 5 int cost; 6 int m;//物品个数 7 int *price = new int[m];//物品单价 8 int cnt[100];//物品数目 9 int total;//方案数目 10 int ans[100][100];//每种方案的商品分布 11 12 void output() 13 { 14 int i,j,k; 15 cout<<total<<endl; 16 for(i=0; i<total; i++) 17 { 18 cout<<ans[i][0];//不多输出空格 19 for(j=1; j<m; j++) 20 cout<<" "<<ans[i][j]; 21 cout<<endl; 22 } 23 } 24 25 //回溯,第cur种物品分为买或者 不买 26 void fun(int cur) 27 { 28 if(cost >1000||cur >= m)//因为cur从0开始因此需要加上等号 29 return ; 30 if(1000 == cost) 31 { 32 for(int i=0; i<m; i++) 33 ans[total][i] = cnt[i]; 34 total++; 35 return ; 36 } 37 //选 择第cur种物品 38 ++cnt[cur]; 39 cost += price[cur]; 40 fun(cur);//不是cur + 1因为还可能会选择那种物品 41 //不选择第cur种物品 42 --cnt[cur]; 43 cost -= price[cur]; 44 fun(cur+1); 45 } 46 47 int main() 48 { 49 int i,j,k; 50 cin>>m; 51 for(i=0; i<m; i++) 52 cin>>price[i]; 53 fun(0); 54 output(); 55 delete price; 56 while(1); 57 return 0; 58 } 59 /*提出问题 60 C++中可以在main函数外动态申请空间么,空间大小由main内的输入参数决定? 61 那个参数得是全局变量就可以new和delete了。 62 全局参数默认为0,不知道new出来的空间是不是想要的,但是本题运行正确 63 目前还没找到理论支持。 64 */ 65 /*神说我的想法不对 66 int * a; 67 int main() 68 { 69 a =new int[3]; 70 return 0; 71 } 72 73 这个3你可以从main参数里传入 74 */ 75 76
今个同学说输出是否需要按照字典序, 若按照的话需要先把二维数组ans换位字符数组,可以直接复制进char数组,然后排序。
itoa在stdlib.h中是非标准的,就是说不一定在所有的编译器都支持,char *itoa(int value, char *string, int radix);nt value 被转换的整数,char *string 转换后储存的字符数组,int radix 转换进制数,若是不支持可以用sprintf(buf,"%d",a),则把整形a存进字符数组里。
sscanf(buf,"%d",a),则把buf当做标准输入从中取出第一个整数存入a。
atoi在stdio.h中,是标准的函数,int atoi(const char *nptr)把字符串转换为整形,包括正负号。