题意:
对方有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;
}