如题:http://poj.org/problem?id=1042
题目大意:n个池塘,每个池塘每5分钟可以钓到f[i]条鱼,每5分钟可以钓到的鱼数量以d[i]数量递减,池塘只能从1走到n,t[i]代表从i池塘走到i+1池塘的时间.不能回头,给定时间x小时,问每个池塘最优待几分钟钓到的鱼最多
因为池塘之间互不影响,可以采用贪心算法,子问题最优解合并为最终最优解,从1-n个池塘中每次从1池塘出发选择可以钓鱼数最多的,sum累加算出钓鱼的次数,每次钓鱼5分钟,最终时间为*5
#include<iostream>
using namespace std;
#define MAXN 28
#define MIN -999999999
int f[MAXN];
int t[MAXN]; //t[i]为从i到i+1走的时间*5,也就是走的过程中可以钓鱼的次数
int d[MAXN];
int b[MAXN];
int bb[MAXN];
int ff[MAXN];
int main()
{
int h,N,i,sum,max,count,j,pos;
while(scanf("%d",&N)!=EOF)
{
if(N==0) break;
scanf("%d",&h);
for(i=1;i<=N;i++)
scanf("%d",&f[i]);
for(i=1;i<=N;i++)
scanf("%d",&d[i]);
for(i=1;i<=N-1;i++)
scanf("%d",&t[i]);
max=MIN;
for(i=1;i<=N;i++)
{
sum=0;
count=h*12; //最多可以钓鱼的次数
memset(b,0,sizeof(b)); //b要清0
for(j=1;j<i;j++)
{
count-=t[j];
ff[j]=f[j]; //ff[j]辅助数组
}
ff[i]=f[i]; //最终走到的池塘单独处理
for(count;count>0;count--) //把次数用完,记录每个池塘呆的时间
{
pos=1; //将要钓鱼的位置
for(j=2;j<=i;j++)
if(ff[j]>ff[pos])
pos=j;
if(ff[pos]>0)
{
sum+=ff[pos];
ff[pos]-=d[pos];
if(ff[pos]<0)
ff[pos]=0;
}
b[pos]++; //访问次数+1
}
if(max<sum)
{
max=sum;
for(j=1;j<=N;j++)
bb[j]=b[j]; //信息保存
}
}
printf("%d",5*bb[1]);
for(i=2;i<=N;i++)
printf(", %d",5*bb[i]);
printf("\nNumber of fish expected: %d\n\n",max);
}
return 0;
}