标签:
•题目描述
Spore中用以代表经济的是一种叫做“香料矿”的矿物。香料矿有不同的种类,可以由它们的颜色轻易区分开来。
火星怪兽已经控制了一些星系,并且在这些星系上建立了殖民地来开采香料矿。由于每个殖民地储存开采出来的香料的能力是有限的,在一次远征任务完成之后,火星怪兽发现他所有殖民地的香料库都满了,无法继续开采。为了不浪费时间,他决定把所有的香料都运回母星进行处理。
火星怪兽的母星上有一座香料处理工厂,它有两台处理机,所以可以同时处理两批香料。但是不同的香料一起进入工厂是会出现危险的,所以这座工厂的两台处理机同一时刻处理的香料必须是相同种类的。
现在有M种香料,共N批(M <= 10, N <= 100),每一批香料所的种类及其需要的处理时间都是已知的。对于每一批香料,你可以选择由两台机器的任何一台来处理。你的任务是帮助火星怪兽确定一个处理方案,以在最短的时间内处理完所有香料,好给他腾出一点时间去看最近更新的宅男动漫。
•输入格式
输入数据包含了多个测试点。每一个测试点格式如下:
第一行,两个由空格分开的整数,分别代表M、N。
第二行,M个由空格隔开的字符串,长度均不超过10,为各种香料的名称。
以下N行,每行一个整数Ti(0<Ti<=1000)以及一个字符串Si,分别代表第i批香料所需要的处理时间及其种类。
输入文件以M=0、N=0结束。
•输出格式
对于每个测试点,输出一行,仅包含一个整数,代表最少所需要的时间。
•输入样例
3 4
red blue yellow
2 red
3 blue
4 blue
6 red
0 0
•输出样例
10
首先,不同的种类之间不会相互影响,因为两台机器只能在同时加工相同种类的香料。
于是可以先将不同的种类分个类,我是直接每出现一个香料,都去搜一遍,它属于几号,当然直接排序也可以。
然后对于每种香料,我们知道如果,它的总时间t/2是不变的(这个总时间是指该类所有香料挨个挨个加工所需的总时间),然而如果一个机器刚好可以加工t/2(假设能整除)的时间
那么时间肯定是t/2,然而,一个机器可能加工的不会刚好是t/2,于是某台机器可能加工的是<=t/2的,当然时间就是另一台机器所用的时间,
于是我们可以定义f[i][j]表示在前i个香料中,时间不超过j的最少时间,所以每个香料都有选与不选两种情况,因为这个机器不选,肯定是另一个机器加工。
于是f[i][j]=max(f[i-1][j],f[i-1][j-t[j]]+t[j]),其实这里可以定义为bool类型的数组,当然你像我这样定义也可以,而我下面是用了滚动数组。
1 #include <iostream> 2 #include <fstream> 3 #include <cstdlib> 4 #include <cstring> 5 #include <string> 6 #include <vector> 7 /* run this program using the console pauser or add your own getch, system("pause") or input loop */ 8 using namespace std; 9 vector< vector <int> >kins(11); 10 int m,n,f[10003]; 11 char kind[11][11];int tot[11],sc[11],sum[11]; 12 13 14 int main(int argc, char *argv[]) { 15 memset(tot,-1,sizeof(tot)); 16 memset(sc,-1,sizeof(sc)); 17 while(scanf("%d%d",&m,&n)){ 18 if(m==0&&n==0)break; 19 memset(sum,0,sizeof(sum)); 20 memset(f,0,sizeof(f)); 21 for(int x=1;x<=m;x++)cin>>kind[x]; 22 for(int x=1;x<=n;x++){ 23 int a;char b[11]; 24 scanf("%d%s",&a,b); 25 for(int y=1;y<=m;y++){ 26 string c=b,d=kind[y]; 27 if(c!=d)continue; 28 tot[y]++;sum[y]+=a; 29 kins[y].push_back(a); 30 break; 31 } 32 } 33 int ans=0; 34 for(int x=1;x<=m;x++){ 35 memset(f,0,sizeof(f)); 36 for(int i=sc[x]+1;i<=tot[x];i++){ 37 for(int j=sum[x]/2;j>=kins[x][i];j--){ 38 f[j]=max(f[j],f[j-kins[x][i]]+kins[x][i]); 39 } 40 } 41 ans+=sum[x]-f[sum[x]/2]; 42 } 43 for(int x=1;x<=m;x++)sc[x]=tot[x]; 44 printf("%d\n",ans); 45 } 46 return 0; 47 48 }
标签:
原文地址:http://www.cnblogs.com/Ateisti/p/5791186.html