软件大赛(购物计划)

公司发了某商店的购物券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)把字符串转换为整形,包括正负号。

原文地址:https://www.cnblogs.com/hxsyl/p/2819911.html