程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> 812 - Trade on Verweggistan (暴力枚舉)

812 - Trade on Verweggistan (暴力枚舉)

編輯:C++入門知識

Trade on Verweggistan

Since the days of Peter Stuyvesant and Abel Tasman, Dutch merchants have been traveling all over the world to buy and sell goods. Once there was some trade on Verweggistan, but it ended after a short time. After reading this story you will understand why.

At that time Verweggistan was quite popular, because it was the only place in the world where people knew how to make a `prul'. The end of the trade on Verweggistan meant the end of the trade in pruls (or `prullen', as the Dutch plural said), and very few people nowadays know what a prul actually is.

Pruls were manufactured in workyards. Whenever a prul was finished it was packed in a box, which was then placed on top of the pile of previously produced pruls. On the side of each box the price was written. The price depended on the time it took to manufacture the prul. If all went well, a prul would cost one or two florins, but on a bad day the price could easily rise to 15 florins or more. This had nothing to do with quality; all pruls had the same value.

In those days pruls sold for 10 florins each in Holland. Transportation costs were negligible since the pruls were taken as extra on ships that would sail anyway. When a Dutch merchant went to Verweggistan, he had a clear purpose: buy pruls, sell them in Holland, and maximize his profits. Unfortunately, the Verweggistan way of trading pruls made this more complicated than one would think.

One would expect that merchants would simply buy the cheapest pruls, and the pruls that cost more than 10 florins would remain unsold. Unfortunately, all workyards on Verweggistan sold their pruls in a particular order. The box on top of the pile was sold first, then the second one from the top, and so on. So even if the fifth box from the top was the cheapest one, a merchant would have to buy the other four boxes above to obtain it.


As you can imagine, this made it quite difficult for the merchants to maximize their profits by buying the right set of pruls. Not having computers to help with optimization, they quickly lost interest in trading pruls at all.

In this problem, you are given the description of several workyard piles. You have to calculate the maximum profit a merchant can obtain by buying pruls from the piles according to the restrictions given above. In addition, you have to determine the number of pruls he has to buy to achieve this profit.

Input

The input describes several test cases. The first line of input for each test case contains a single integerw, the number of workyards in the test case ( 1$ \le$w$ \le$50).

This is followed by w lines, each describing a pile of pruls. The first number in each line is the number bof boxes in the pile ( 0$ \le$b$ \le$20). Following it are b positive integers, indicating the prices (in florins) of the pruls in the stack, given from top to bottom.

The input is terminated by a description starting with w = 0. This description should not be processed.

Output

For each test case, print the case number (1, 2, ...). Then print two lines, the first containing the maximum profit the merchant can achieve. The second line should specify the number of pruls the merchant has to buy to obtain this profit. If this number is not uniquely determined, print the possible values in increasing order. If there are more than ten possible values, print only the 10 smallest.

Display a blank line between test cases.

Sample Input

1
6 12 3 10 7 16 5
2
5 7 3 11 9 10
9 1 2 3 4 10 16 10 4 16
0

Sample Output

Workyards 1
Maximum profit is 8.
Number of pruls to buy: 4

Workyards 2
Maximum profit is 40.
Number of pruls to buy: 6 7 8 9 10 12 13

題意:給定n個wordyard。每個給定b個pruls。這是一個棧從頂到底。現在每個wordyard都可以取一些出來。,每個利潤是10 - 每個pruls的價值。求最大利潤,和組成個數,注意如果組成個數情況不同,輸出前10個最小的。

思路:對於每個wordyard枚舉最大利潤,並把個數保存下來,然後把所有種數加起來保存到一個set裡面

代碼:

#include 
#include 
#include 
#include 
#include 
using namespace std;
#define max(a,b) (a)>(b)?(a):(b)
#define min(a,b) (a)<(b)?(a):(b)
const int N = 55;
const int M = 25;

int n, num[N][M], res[N][M], resn[N];
set ans;

void init() {
	ans.clear();
	memset(resn, 0, sizeof(resn));
	for (int i = 0; i < n; i++) {
		scanf("%d", &num[i][0]);
		for (int j = 1; j <= num[i][0]; j++)
			scanf("%d", &num[i][j]);
	}
}

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

void solve() {
	int Max = 0;
	for (int i = 0; i < n; i++) {
		int sum = 0, Maxx = 0; resn[i] = 1; res[i][0] = 0;
		for (int j = 1; j <= num[i][0]; j++) {
			sum += 10 - num[i][j];
			if (sum > Maxx) {
				Maxx = sum;
				resn[i] = 1;
				res[i][0] = j;
			}
			else if (sum == Maxx)
				res[i][resn[i]++] = j;
		}
		Max += Maxx;
	}
	printf("Maximum profit is %d.\n", Max);
	printf("Number of pruls to buy:");
	cal(0, 0);
	int count = 0;
	for (set::iterator it = ans.begin(); it != ans.end() && count != 10; it++, count++)
		cout <<" "<< *it;
	printf("\n");
}

int main() {
	int cas = 0;
	while (~scanf("%d", &n) && n) {
		if (cas) printf("\n");
		init();
		printf("Workyards %d\n", ++cas);
		solve();
	}
	return 0;
}


  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved