zoukankan      html  css  js  c++  java
  • 软件大赛(购物计划)

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

  • 相关阅读:
    SpringMVC的DispatcherServlet加载过程
    SpringMVC-HandlerMapping和HandlerAdapter
    FactoryBean简介
    Spring IOC过程
    redis基本数据类型和对应的底层数据结构
    工厂模式
    springmvc工作原理
    Java虚拟机系列-Java类加载机制
    2019年10月21日 数据库sql只取最新一条的数据
    洛谷 P2606 [ZJOI2010]排列计数
  • 原文地址:https://www.cnblogs.com/hxsyl/p/2819911.html
Copyright © 2011-2022 走看看