宝石(暴力搜)

本文探讨了如何通过合理地合成宝石,最大化一篮子宝石的总价值。详细介绍了三种基本宝石及其合成规则,以及如何根据给定的宝石数量和价格进行最优组合。

宝石

Time Limit : 3000/1000ms (Java/Other)   Memory Limit : 65535/32768K (Java/Other)
Total Submission(s) : 0   Accepted Submission(s) : 0
Font: Times New Roman | Verdana | Georgia
Font Size:  

Problem Description

有一个商人喜欢收集一些宝石,有一天他得到了三种十分好看的宝石,把它们分别取名为 M, V, P。它们对应的单个价值为 DM, DV, DP。宝石可以两两合成,如M, V可以合成为新的高级宝石C, 价值为DC。 M, P 可以合成为新的高级宝石H,价值为DH。V, P 可以合成为新的高级宝石Y,价值为DY。最后,M, V, P 一起可以合成最高级宝石W, 价值为 DW。
现在,商人有一篮子宝石,以一个字符串表示。商人想知道如何合成这一篮子宝石,使得这一篮子的宝石价值和最大,每一个单个宝石最多只能合成一次或者不合成。求这一篮子的宝石的价值最大值。

Input

多组测试样例
每组测试样例第一行输入7个整数,分别表示DM, DV, DP, DC, DH, DY, DW。第二行输入一个字符串,如VVP, MVVPMMP等。所有整数的绝对值小于100。字符串长度小于等于40且不为空。 

Output

输出一个整数,表示这一篮子的宝石的最大价值。

Sample Input

1 1 1 2 2 2 5
PVM
-5 1 1 1 1 1 1
MMM

Sample Output

5
-15
#include<stdio.h>
int main(){
	int dm, dv, dp, dc, dh, dy, dw;
	int cc,ch,cy,cw;
	int fm,fv,fp;
	int i,max;
	int tm,tv,tp,t;
	char str[50];
	while(~scanf("%d%d%d%d%d%d%d",&dm,&dv,&dp,&dc,&dh,&dy,&dw)){
		scanf("%s",str);
		fm=fv=fp=i=0;
		while(str[i]){
			if(str[i]=='M')fm++;
			else if(str[i]=='V')fv++;
			else if(str[i]=='P')fp++;
			i++;
		}
		max=-200000000;
		for(cc=0;cc<=20;cc++){
			for(ch=0;ch<=20;ch++){
				for(cy=0;cy<=20;cy++){
					for(cw=0;cw<=20;cw++){
						tm=fm-cc-ch-cw;
						tv=fv-cc-cy-cw;
						tp=fp-ch-cy-cw;
						if(tm>=0&&tv>=0&&tp>=0){
							t=tm*dm+tv*dv+tp*dp;
							t+=cc*dc+ch*dh+cy*dy+cw*dw;
							if(max<t)max=t;
						}
					}
				}
			}
		}
		printf("%d\n",max);
	}
	
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值