uva 812 Trade on Verweggistan

题意:

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

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

思路:

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

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

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

代码:

  

  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 }

时间: 2024-12-15 05:33:20

uva 812 Trade on Verweggistan的相关文章

UVA - 812 Trade on Verweggistan dfs + 贪心

题目大意:有n堆东西,只能从上往下买,如果要买下面的东西,只能把上面的所有东西买了才可以,类似一个栈 每个东西都有价格,每个东西卖出去都只能卖10,问能卖的最大利润,和要卖多少个才能达到最大利润 解题思路:贪心的来说每个买了的都要卖出去,才能使得利润最大化,纪录每堆卖出最大利润的所有情况,然后用dfs一一枚举,要判重和排序输出 注意特例,都是0的情况 1 5 10 10 10 10 10 输出应该有0 1 2 3 4 5 #include<cstdio> #include<cstring

uva 812(暴力)

题意:有n个货架上摆放了b个货物,然后从左到右的给出每个货架上货物买入的价格,要拿去卖掉以统一价10,问如果买入形式是栈,要买一个货物必须把他左边的东西都买了才可以,问最大利润是多少,要买多少个货物达到最大利润,按字典序输出所有可能情况(最多10种). 题解:水题,暴力出所有情况. 第二组样例举例: 3 10 9 10 10 购买数量可能情况:2 4 5 9 17 24 30 30 24 24 30 24 购买数量可能情况: 4 5 8 然后就是6个数字的排列组合相加得到所有解.注意数量可能为0

poj 动态规划题目列表及总结

此文转载别人,希望自己能够做完这些题目! 1.POJ动态规划题目列表 容易:1018, 1050, 1083, 1088, 1125, 1143, 1157, 1163, 1178, 1179, 1189, 1208, 1276,1322, 1414, 1456, 1458, 1609, 1644, 1664, 1690, 1699, 1740(博弈),1742, 1887, 1926(马尔科夫矩阵,求平衡), 1936, 1952, 1953, 1958, 1959, 1962, 1975,

DP题目列表/弟屁专题

声明: 1.这份列表不是我原创的,放到这里便于自己浏览和查找题目. ※最近更新:Poj斜率优化题目 1180,2018,3709 列表一:经典题目题号:容易: 1018, 1050, 1083, 1088, 1125, 1143, 1157, 1163, 1178, 1179, 1189, 1191,1208, 1276, 1322, 1414, 1456, 1458, 1609, 1644, 1664, 1690, 1699, 1740, 1742, 1887, 1926, 1936, 195

[转] POJ DP问题

列表一:经典题目题号:容易: 1018, 1050, 1083, 1088, 1125, 1143, 1157, 1163, 1178, 1179, 1189, 1191,1208, 1276, 1322, 1414, 1456, 1458, 1609, 1644, 1664, 1690, 1699, 1740, 1742, 1887, 1926, 1936, 1952, 1953, 1958, 1959, 1962, 1975, 1989, 2018, 2029, 2039, 2063, 20

UVA 563 Crimewave (最大流,拆点)

http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=504  Crimewave  Nieuw Knollendam is a very modern town. This becomes clear already when looking at the layout of its map, which is just a rectangula

UVA - 1323 Vivian&#39;s Problem

Description The desire to explore the unknown has been a driving force in human history since the dawn of time. From the earliestdocumented accounts, ancient civilizations had explored the earth by sailing around. Early adventurers were motivatedby r

【暑假】[深入动态规划]UVa 1412 Fund Management

UVa 1412 Fund Management 题目: UVA - 1412 Fund Management Time Limit: 3000MS   Memory Limit: Unknown   64bit IO Format: %lld & %llu Submit Status Description Frank is a portfolio manager of a closed-end fund for Advanced Commercial Markets (ACM ). Fund

UVA 562 Dividing coins --01背包的变形

01背包的变形. 先算出硬币面值的总和,然后此题变成求背包容量为V=sum/2时,能装的最多的硬币,然后将剩余的面值和它相减取一个绝对值就是最小的差值. 代码: #include <iostream> #include <cstdio> #include <cstring> #include <cmath> #include <algorithm> using namespace std; #define N 50007 int c[102],d