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 // 代码一:---自己写的
      2 //-----我用dev编译不通过,全局数组count在递归中不被识别,
      3 //不知道为啥,VC 6.0就能通过,    求解释???
      4 
      5 #include <iostream>
      6 #include <cstdio>
      7 #include <cstring>
      8 
      9 using namespace std;
     10 
     11 int count[1000]; //  记录每种物品选择的个数
     12 int num, n;   // 记录总共的方案数量
     13 int ans[1000][1000];  // 记录方案的 矩阵
     14 int price[100];
     15 
     16 void search(int cur, int sum, int money)
     17 {
     18     if(sum == money)  // sum 表示当前花费
     19     {
     20         for(int i = 0; i < n; ++i)
     21             ans[num][i] = count[i];
     22         ++num;
     23         return;
     24     }
     25     if(sum > money || cur >= n)
     26         return;
     27 
     28     //  选择一个第 cur 种 物品
     29     sum += price[cur];
     30     ++count[cur];
     31     search(cur, sum, money);
     32 
     33     //  不选择一个第 cur 种 物品
     34     sum -= price[cur];
     35     --count[cur];
     36     search(cur + 1, sum, money);
     37 }
     38 
     39 int main()
     40 {
     41     while(~scanf("%d", &n))
     42     {
     43 
     44         for(int i = 0; i < n; ++i)
     45             for(int j = 0; j < n; ++j)
     46                 ans[i][j] = 0;
     47         memset(count, 0, sizeof(count));
     48         num = 0;
     49         for(int i = 0; i < n; ++i)
     50             scanf("%d", &price[i]);
     51         search(0, 0, 1000);
     52         printf("%d\n", num);
     53         for(int i = 0; i < num; ++i)
     54         {
     55             for(int j = 0; j < n; ++j)
     56                 printf("%d ", ans[i][j]);
     57             printf("\n");
     58         }
     59     }
     60     return 0;
     61 }
     62 */
     63 
     64 // 代码二:
     65 #include <stdio.h>
     66 
     67 int sln;//方案的个数
     68 int gm;//商品的种类
     69 int price[1000];//各种商品价钱
     70 int count[1000];//各种商品的个数
     71 int method[1000][1000];//每种解决方案中各商品的个数
     72 int cost;//当前花费
     73 void output()//输出解决方案
     74 {
     75     int i,j;
     76     printf("%d\n",sln);
     77     for (i=0; i<sln; i++)
     78     {
     79         for (j=0;j<gm;j++)
     80             printf("%3d",method[i][j]);
     81         printf("\n");
     82     }
     83 }
     84 void fun(int m)
     85 {
     86     int i;
     87     if (cost == 1000)
     88     {
     89         for (i=0; i<gm ; i++)
     90             method[sln][i] = count[i];
     91         sln++;
     92         return;
     93     }
     94     if (cost>1000 || m<0)
     95         return;
     96     //choose m
     97     ++count[m];
     98     cost += price[m];
     99     fun(m);
    100     //not choose m
    101     --count[m];
    102     cost -= price[m];
    103     fun(m-1);
    104 }
    105 void main()
    106 {
    107     int m;//商品的种类
    108     int k;
    109 
    110     scanf("%d",&m);
    111     gm=m;
    112     for (k=0;k<m;k++)
    113         scanf("%d",&price[k]);
    114     fun(m-1);
    115     output();
    116 }

     代码三:------------------复习回顾

     1 #include <cstdio>
     2 #include <iostream>
     3 #include <cstring>
     4 
     5 using namespace std;
     6 
     7 int res[1000][1000], tmp[1000], price[1000];
     8 
     9 int cnt, n;
    10 
    11 void DFS(int left, int pos)
    12 {
    13     if(left == 0)
    14     {
    15         for(int i = 0; i <= pos; ++i)
    16             res[cnt][i] = tmp[i];
    17         ++cnt;
    18         return;
    19     }
    20     if(left < price[pos] || pos >= n)
    21         return;
    22     if(left >= price[pos])
    23     {
    24         tmp[pos]++;
    25         DFS(left-price[pos], pos);
    26         tmp[pos]--;
    27         DFS(left, pos+1);
    28     }
    29 }
    30 
    31 void Output()
    32 {
    33     printf("%d\n", cnt);
    34     for(int i = 0; i < cnt; ++i)
    35     {
    36         for(int j = 0; j < n-1; ++j)
    37             printf("%d ", res[i][j]);
    38         printf("%d\n", res[i][n-1]);
    39     }
    40 }
    41 
    42 int main()
    43 {
    44     freopen("in.txt", "r", stdin);
    45     //freopen("out.txt", "w", stdout);
    46     while(~scanf("%d", &n))
    47     {
    48         for(int i = 0; i < n; ++i)
    49             scanf("%d", &price[i]);
    50         cnt = 0;
    51         memset(tmp, 0, sizeof(tmp));
    52         DFS(1000, 0);
    53         Output();
    54     }
    55     while(1);
    56     return 0;
    57 } 
    功不成,身已退
  • 相关阅读:
    第十三周作业
    第十二周作业2
    第十二周作业
    第十一次作业
    第十周作业
    第九周作业
    第十五次作业
    十四周上机作业
    第十三周上机作业
    第十二周作业
  • 原文地址:https://www.cnblogs.com/dongsheng/p/2809257.html
Copyright © 2011-2022 走看看