您的位置:首页

UVA - 812 Trade on Verweggistan

2017-05-04 19:49 579 查看
题意:首先给你个w,表示几组货物。然后给你n以及n个数表示价格,10-价格是利润

每次仅仅能取前i个,求最多的利润相应几个货物,不超过10个解

思路:首先是简单的计算最大的利润。然后就是储存全部的解。然后深搜出全部的可能

#include <iostream>
#include <cstring>
#include <algorithm>
#include <cstdio>
#include <queue>
#include <vector>
#include <set>

using namespace std;

const int MAXN = 100;

int w, val[MAXN][MAXN];
set<int > ans;
vector<int > p[MAXN];

void cal(int n, int sum) {
if (n == w) {
ans.insert(sum);
return;
}
for (int i = 0; i < p
.size(); i++)
cal(n+1, sum+p
[i]);
}

void solve() {
ans.clear();
int valMax[MAXN], valSum, pro;
valSum = 0;
memset(valMax, 0, sizeof(valMax));
for (int i = 0; i < w; i++) {
p[i].clear();
pro = 0;
for (int j = 1; j <= val[i][0]; j++) {
pro += 10 - val[i][j];
valMax[i] = max(valMax[i], pro);
}
valSum += valMax[i];
if (valMax[i] == 0)
p[i].push_back(0);
pro = 0;
for (int j = 1; j <= val[i][0]; j++) {
pro += 10 - val[i][j];
if (valMax[i] == pro)
p[i].push_back(j);
}
}
cal(0, 0);
printf("Maximum profit is %d.\n", valSum);
printf("Number of pruls to buy:");
int cnt = 0;
for (set<int>::iterator i = ans.begin(); i != ans.end() && cnt != 10; i++, cnt++)
printf(" %d", *i);
printf("\n");
}

int main() {
int t = 0;

while (scanf("%d", &w) != EOF && w) {
int b;
for (int i = 0; i < w; i++) {
scanf("%d", &val[i][0]);
for (int j = 1; j <= val[i][0]; j++)
scanf("%d", &val[i][j]);
}

if (t)
printf("\n");
printf("Workyards %d\n", ++t);
solve();
}

return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: