uva812(暴力)

来源:互联网 发布:spring源码 事务 编辑:程序博客网 时间:2024/05/01 23:33

题意:

先给出有几叠商品,然后每叠商品有几个,从上到下的价格是多少;

每一个商品不管你买了多少钱,卖出去都是10块;

现在有个规定,你只能从上往下买商品,要想买下面的商品,就要把它上面的全买了;

问最大利润是多少;还有要买几个商品.如果买的商品数量不同,但都能达到最大利润,就从小到大输出,超过10个,输出最少的10个;


思路:

首先直接遍历算出每一叠所能达到的最大值,已经达到最大值的商品数有哪些;

然后每个最大值相加就是最大利润;

把每一叠能达到最大值的商品个数dfs()算出所有情况;


#include<cstdio>#include<cstring>#include<algorithm>#include<queue>#include<vector>#include<set>using namespace std;int prul[55][25];int ways[55][25];int len[55];int w,b,sum,Max,cur;priority_queue<int, vector<int>, greater<int> > q;set<int> s;void dfs(int cur,int sum) {if(cur == w) {if(!s.count(sum)) {s.insert(sum);q.push(sum);}return;}for(int i = 1; i <= len[cur]; i++) {dfs(cur + 1, sum + ways[cur][i]);}}int main() {int cas = 0;while(scanf("%d",&w) && w) {while(!q.empty())q.pop();s.clear();sum = 0;memset(len, 0,sizeof(len));for(int i = 0; i < w; i++) {Max = 0;cur = 0;scanf("%d",&b);len[i] = 1;ways[i][len[i]] = 0;for(int j = 0 ;j < b;j++) {scanf("%d",&prul[i][j]);cur += (10 - prul[i][j]);if(cur > Max) {Max = cur;len[i] = 1;ways[i][len[i]] = j + 1;}else if(cur == Max) {len[i]++;ways[i][len[i]] = j + 1;}}sum += Max;}dfs(0,0);if(cas)printf("\n");printf("Workyards %d\n",++cas);printf("Maximum profit is %d.\n",sum);printf("Number of pruls to buy:");for(int i = 0 ; i < 10; i++) {if(q.empty())break;printf(" %d",q.top());q.pop();}printf("\n");}return 0;}


0 0
原创粉丝点击