NYOJ 203-三国志

点击打开连接php

三国志

时间限制: 3000 ms  |  内存限制: 65535 KB
难度: 5
描述

《三国志》是一款很经典的经营策略类游戏。咱们的小白同窗是这款游戏的忠实玩家。如今他把游戏简化一下,地图上只有他一方势力,如今他只有一个城池,而他周边有一些无人占的空城,可是这些空城中有不少不一样数量的同种财宝。咱们的小白同窗虎视眈眈的看着这些城池中的财宝。测试

按照游戏的规则,他只要指派一名武将攻占这座城池,里面的财宝就归他全部了。不过一量攻占这座城池,咱们的武将就要留守,不能撤回。由于咱们的小白手下有无数的武将,因此他不在意这些。spa

从小白的城池派出的武将,每走一公理的距离就要消耗一石的粮食,而他手上的粮食是有限的。如今小白统计出了地图上城池间的道路,这些道路都是双向的,他想请你帮忙计算出他能获得 的最多的财宝数量。咱们用城池的编号表明城池,规定小白所在的城池为0号城池,其余的城池从1号开始计数。.net

输入
本题包含多组数据:
首先,是一个整数T(1<=T<=20),表明数据的组数
而后,下面是T组测试数据。对于每组数据包含三行:
第一行:三个数字S,N,M
(1<=S<=1000000,1<=N<=100,1<=M<=10000)
S表明他手中的粮食(石),N表明城池个数,M表明道路条数。
第二行:包含M个三元组行 Ai,Bi,Ci(1<=A,B<=N,1<=C<=100)。
表明Ai,Bi两城池间的道路长度为Ci(千米)。
第三行:包含N个元素,Vi表明第i个城池中的财宝数量。(1<=V<=100)
输出
每组输出各占一行,输出仅一个整数,表示小白能获得的最大财富值。
样例输入
2
10 1 1
0 1 3
2
5 2 3
0 1 2 0 2 4 1 2 1
2 3
样例输出
2
5


用迪杰斯特拉求最短路径,而后用最基本的01背包求出最大收益,注意题目中有重边,取最小的那个边,这让我错了一天!!一成天啥也没干,靠!


#include<stdio.h>
#include<string.h>
int map[110][110];
int cost[110];
int value[110];
int n;
int dp[1000010];
bool used[110];
void dij()
{
	memset(cost, 127, sizeof(cost));
	cost[0] = 0;
	memset(used, 0, sizeof(used));
	int i, j;
	int mark , min;
	for(i = 0; i <= n; i++)
	{
		min = 0x7fffffff;
		mark = 0;
		for(j = 0; j <= n; j++)
		{
			if(used[j] == 0)
			{
				if(cost[j] < min)
				{
					min = cost[j];
					mark = j;
				}
			}
		}
		used[mark] = 1;
		for(j = 1; j <= n; j++)
		{
			if(map[mark][j] < 100000000 && !used[j])
			{
				cost[j] = cost[j] > (cost[mark] + map[mark][j]) ? (cost[mark] + map[mark][j]) : cost[j];
			}
		}
	}
}
int main()
{
//	freopen("test.txt", "r", stdin);
	int t;
	scanf("%d", &t);
	while(t--)
	{
		int s, m;
		memset(map, 127, sizeof(map));
		memset(value, 0, sizeof(value));
		memset(dp, 0, sizeof(dp));
		scanf("%d%d%d", &s, &n, &m);
		int i;
		int S, E, l;
		for(i = 0; i < m; i++)
		{
			scanf("%d%d%d", &S, &E, &l);
			map[S][E] = map[S][E] > l ? l : map[S][E];
			map[E][S] = map[S][E];
		}
		for(i = 1; i <= n; i++)
		{
			scanf("%d", &l);
			value[i] = l;
		}
		dij();
		int j;
		for(i = 1; i <= n; i++)
		{
			for(j = s; j - cost[i] >= 0; j--)
			{
				dp[j] = dp[j] > (dp[j - cost[i]] + value[i]) ? dp[j] : (dp[j - cost[i]] + value[i]);
			}
		}
		printf("%d\n", dp[s]);
	}
	return 0;
}
相关文章
相关标签/搜索