您的位置:首页 > 其它

uva812(暴力)

2015-04-23 20:36 351 查看
题意:

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

每一个商品不管你买了多少钱,卖出去都是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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: