码迷,mamicode.com
首页 > 其他好文 > 详细

uva812(暴力)

时间:2015-04-24 09:13:59      阅读:123      评论:0      收藏:0      [点我收藏+]

标签:uva

题意:

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

每一个商品不管你买了多少钱,卖出去都是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;
}


uva812(暴力)

标签:uva

原文地址:http://blog.csdn.net/yeyeyeguoguo/article/details/45226679

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!