前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >uva 812 Trade on Verweggistan

uva 812 Trade on Verweggistan

作者头像
熙世
发布2019-07-15 16:48:12
3790
发布2019-07-15 16:48:12
举报
文章被收录于专栏:Code思维奇妙屋

题意:

  给w个货架, 每个货架上有bi个货物, 每次只能拿最上面的货物, 每个货物有个价值, 所有货物的售价均为10。

  问:能获得的最大利润, 以及能获得这个利润需要多少个货物。 (有多种组合时只需输出前10种)

思路:

  最开始我是先将最大价值预处理了出来, 然后dfs查找方案数, 结果超时了, 后来发现复杂度是O(w*bi), 完全的暴力,可以先将每个货架的最大利润处理出来, 同时处理出来获得这个最大利润所需要的物品数。

  后来又WA了几发, 第一次是发现自己没有处理如果利润为负时, 结果应该输出0的情况。

  第二次发现没有处理某个货架最大利润为0时可以一个都不取的情况。

代码:

代码语言:javascript
复制
  1 #include <cmath>
  2 #include <cstdio>
  3 #include <cstring>
  4 #include <cstdlib>
  5 #include <ctime>
  6 #include <set>
  7 #include <map>
  8 #include <list>
  9 #include <stack>
 10 #include <queue>
 11 #include <string>
 12 #include <vector>
 13 #include <fstream>
 14 #include <iterator>
 15 #include <iostream>
 16 #include <algorithm>
 17 using namespace std;
 18 #define LL long long
 19 #define INF 0x3f3f3f3f
 20 #define MOD 1000000007
 21 #define eps 1e-6
 22 #define MAXN 100
 23 #define MAXM 30
 24 #define dd {cout<<"debug"<<endl;}
 25 #define pa {system("pause");}
 26 #define p(x) {printf("%d\n", x);}
 27 #define pd(x) {printf("%.7lf\n", x);}
 28 #define k(x) {printf("Case %d: ", ++x);}
 29 #define s(x) {scanf("%d", &x);}
 30 #define sd(x) {scanf("%lf", &x);}
 31 #define mes(x, d) {memset(x, d, sizeof(x));}
 32 #define do(i, x) for(i = 0; i < x; i ++)
 33 #define dod(i, x, l) for(i = x; i >= l; i --)
 34 #define doe(i, x) for(i = 1; i <= x; i ++)
 35 int w;
 36 int f[MAXN][MAXM];
 37 int max_ans, kcase = 0;
 38 set <int> ans;
 39 vector <int> g[MAXN];
 40 void read()
 41 {
 42     max_ans = 0;
 43     for(int i = 0; i < w; i ++)
 44     {
 45         scanf("%d", &f[i][0]);
 46 
 47         int sum = 0;
 48         int max_tmp = 0;
 49         g[i].clear();
 50         for(int j = 1; j <= f[i][0]; j ++)
 51         {
 52             scanf("%d", &f[i][j]);
 53             f[i][j] = 10 - f[i][j];
 54             sum += f[i][j];
 55             if(sum > max_tmp)
 56             {
 57                 max_tmp = sum;
 58                 g[i].clear();
 59             }
 60             if(sum == max_tmp)
 61                 g[i].push_back(j);
 62         }
 63         if(g[i].empty() || max_tmp == 0) g[i].push_back(0); //!!!
 64         max_ans += max_tmp;
 65     }
 66 }
 67 void dfs(int pos, int num)
 68 {
 69     if(pos == w) 
 70     {
 71         ans.insert(num);
 72         return ;
 73     }
 74 
 75     for(int i = 0; i < g[pos].size(); i ++)
 76         dfs(pos + 1, num + g[pos][i]);
 77 }
 78 void show()
 79 {
 80     int cnt = 0;
 81     printf("Workyards %d\n",  ++ kcase);
 82     printf("Maximum profit is %d.\n", max_ans);
 83     printf("Number of pruls to buy:");
 84     for(set <int>::iterator it = ans.begin(); it != ans.end() && cnt < 10; it ++, cnt ++)
 85         printf(" %d", *it);
 86     printf("\n");
 87 }
 88 void solve()
 89 {
 90     ans.clear();
 91     dfs(0, 0);
 92     show();
 93 }
 94 
 95 int main()
 96 {
 97     while(scanf("%d", &w) && w)
 98     {
 99         if(kcase) printf("\n");
100         read();
101         solve();
102     }
103     return 0;
104 }
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2015-10-24 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档