ZOJ3623 Battle Ships

题意:
对方有L滴血,我们有n种船可以选择,每种船建造时间为t,建好后每秒对敌方造成l点伤害,问最少多少时间能干掉对方。
思路:以时间为容量,对对方造成的伤害为价值,完全背包,可以理解成先攻击再造船,因为这两者并没有冲突,状态转移方程:dp[j+time[i]]=max(dp[j]+j*time[i]);dp[j]表示在j这个时间,所造成的最大伤害。这样就可以枚举时间,在每个特定的时间内,枚举船的种类,找到最大值。最终在dp[]数组里面找到符合条件的并且时间最少的解。

#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
#include <algorithm>
using namespace std;
#define maxn 351 /*330+20为最大时间*/
int main()
{
    int i,j;
    int t[35],l[35],n,L;
    int dp[maxn];
    while(~scanf("%d%d",&n,&L))
    {
        for(i=0;i<n;i++)
        {
            scanf("%d%d",&t[i],&l[i]);
        }
        memset(dp, 0, sizeof(dp));
        for(j=0;j<=333;j++)
        {

            for(i=0;i<n;i++)
            {
                dp[j+t[i]]=max(dp[j+t[i]],dp[j]+j*l[i]);
            }
        }
        for(i=0;i<333;i++)
        {
            if(dp[i]>=L)break;
        }
        printf("%d\n",i);

    }
    return 0;
}

你可能感兴趣的:(dp,ZOJ)