Fighting (完全背包问题)

来源:互联网 发布:linux中的find命令 编辑:程序博客网 时间:2024/06/04 01:04

Fighting

Time Limit: 1000ms   Memory limit: 65536K  有疑问?点这里^_^

题目描述

怒海争锋是一个新游戏,类似于星际争霸。在这个游戏中,敌人建造防御塔,血量为L。玩家有一个军事工厂,可以生产N种战斗舰艇。第i个战舰的生产时间为ti,这战舰每秒钟可以让塔损失血量为li。如果塔的寿命低于或等于0,玩家获胜。注意,在每一秒内,军事工厂只能选择一种战斗船生产或什么也不做。选择后的战斗舰艇生产时可以同时生产。不是生产完一个再生产下一个。
 
你的任务是找出玩家赢得比赛的最少时间。 

输入

有多组输入。  
每组的第一行包含两个整数N(1≤N≤30)和L (1≤L≤330),N是军事工厂中有N种战舰,L是防御塔的血量。然后以下N行,每一行包含两个整数ti(1≤ti≤20)第i个战舰的生产时间和li(1≤li≤330)第i个战斗舰艇对塔造成的伤害。

输出

为每个测试用例输出一行。一个整数表示玩家赢得比赛的最少时间。

示例输入

1 11 13 1001 103 2010 100

示例输出

25
#include <stdio.h>#include <string.h>#include <stdlib.h>int main(){    int n,l,i,j;    int dp[1010],time[1001],w[1001];    while (~scanf ("%d%d",&n,&l))    {        int t = 20;        memset(dp,0,sizeof (dp));        memset(w,0,sizeof (w));        memset(time,0,sizeof (time));        for (i = 0;i < n;i++)           {               scanf ("%d%d",time + i,w + i);           }        for (i = 0;i < n;i++)        {            for (j = time[i];j <= 20;j++)//时间无固定要求,所以自定义题目所述(<=600)            {                if(dp[j - time[i]] + w[i]* (j - time[i]) > dp[j]) //判断 是否选择当前 飞船               {                   dp[j] = dp[j - time[i]] + w[i] * (j - time[i]);               }                if (dp[j] >= l && j < t)//符合条件的有多组,选择用时最少的                {                    t = j;                }            }        }        printf ("%d\n",t);    }    return 0;}

0 0
原创粉丝点击