现在的位置: 首页 > 综合 > 正文

1895 应征入伍

2013年03月27日 ⁄ 综合 ⁄ 共 1225字 ⁄ 字号 评论关闭

描述

现在,大学生可以在毕业之后去当兵啦.

今年,一共有n个大学生到你所在的部队来应征,你是一个综合兵营的总管,你的兵营共有海陆空三个兵种,由于每个大学生对不同的兵种有不同的能力值,现在请你安排这几个大学生到相应的兵种中去,使得他们的总战斗力最大,其中海军最多可以安排X人,陆军最多可以安排Y人,空军最多可以安排Z人.

当然,由于种种原因,有些兵种可能得不到足够的人,有些大学生也可能没有任何一个兵种愿意招收。

输入

先输入一个T(T<=110),表示有T组数据,接下来每组数据的开始是一个数n(1<=n<=50),表示有n个大学生,接下来的n行,每行3个整数a,b,c,a表示该大学生做海军的能力值,b表示该大学生做陆军的能力值,c表示该大学生做空军的能力值,(-100<=a,b,c<=100)。最后一行是3个整数X,Y,Z,(0<=X,Y,Z<=80)表示如题意。

输出

每个数据输出一行,有一个整数sum,表示合理安排这些大学生之后能够得到的最大的能力值。

样例输入
2
3
1 2 3
2 3 4
3 4 5
1 1 1
4
-1 2 5
3 6 2
4 7 5
10 7 2
2 0 1
样例输出
9
19

模拟题

#include <stdio.h>
#include <string.h>

int main()
{
	int test;
	int N, a[52], b[52], c[52];
	int X, Y, Z;
	int f[52][52][52], max;
	int sum, m, num, i, j, k;

	scanf("%d", &test);
	while(test--)
	{
		scanf("%d", &N);
		for (i = 1; i <= N; ++i)
			scanf("%d%d%d", &a[i], &b[i], &c[i]);
		scanf("%d%d%d", &X, &Y, &Z);
		X = X < N ? X : N;
		Y = Y < N ? Y : N;
		Z = Z < N ? Z : N;
		sum = (X + Y + Z) < N ? (X + Y + Z) : N;

		memset(f, 0, sizeof(f));
		max = -1;
		for (num = 1; num <= N; ++num)
			for (m = sum < num ? sum : num; m > 0; --m)
				for (i = 0; i <= X; ++i)
					for (j = 0; j <= Y && i + j <= m; ++j)
					{
						k = m - i - j;
						if (k <= Z)
						{
							if (i > 0 && a[num] > 0 && (f[i][j][k] < f[i - 1][j][k] + a[num]))
								f[i][j][k] = f[i - 1][j][k] + a[num];
							if (j > 0 && b[num] > 0 && (f[i][j][k] < f[i][j - 1][k] + b[num]))
								f[i][j][k] = f[i][j - 1][k] + b[num];
							if (k > 0 && c[num] > 0 && (f[i][j][k] < f[i][j][k - 1] + c[num]))
								f[i][j][k] = f[i][j][k - 1] + c[num];
							if (f[i][j][k] > max)
								max = f[i][j][k];
						}
					}
		printf("%d\n", max);
	}
	return 0;
}

抱歉!评论已关闭.