HDU 4563 御剑术I(背包)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4563
题意:一个点开始在原点。有n个命令。第i个命令施加到这个点时,这个点的速度为(Vxi,Vyi),即在x方向的速度为Vxi,在y方向的速度为
Vyi。并且这个命令施加到点时之前的速度全部消失。每种命令最多使用一次。问在x方向走长度为m时在y方向的最大高度是多少?每种命令只能在整数时刻施
加。
思路:首先,每种命令使用的先后顺序显然是没有关系的。除了最后一个施加的命令,之前的命令必然都是使用了整数秒。那么我们枚举每个命令作为最后一个命
令,剩下的n-1个命令进行背包DP,f[i][j]表示前i个命令走长度为j的最大高度。最后枚举最后一个命令使用的时间即可。

double f[N][N];
int a[N],b[N],n,m;

double up(double &x,double y)
{
    if(x<y) x=y;
}

void DP()
{
    int i,j,k;
    FOR1(i,n) FOR0(j,m+1) f[i][j]=-inf;
    double temp;
    for(i=0;i*a[1]<=m;i++) f[1][i*a[1]]=b[1]*i-4.9*i*i;
    for(i=2;i<n;i++) for(j=0;j<=m;j++) for(k=0;k*a[i]+j<=m;k++)
    {
        temp=f[i-1][j]+b[i]*k-4.9*k*k;
        up(f[i][k*a[i]+j],temp);
    }
}

double cal()
{

    if(n==1) return b[1]*(1.0*m/a[1])-4.9*sqr(1.0*m/a[1]);

    int i,j,k;
    double ans=-inf,temp,t;
    FOR1(i,n)
    {
        swap(a[i],a[n]); swap(b[i],b[n]);
        DP();
        for(j=0;j<=m;j++)
        {
            t=1.0*j/a[n];
            temp=f[n-1][m-j]+b[n]*t-4.9*t*t;
            up(ans,temp);
        }
        swap(a[i],a[n]); swap(b[i],b[n]);
    }
    return ans;
}

int main()
{
    int num=0;
    rush()
    {
        RD(n,m);
        int i;
        FOR1(i,n) RD(a[i],b[i]);
        printf("Case %d: ",++num);
        PR(cal());
    }
}

HDU 4563 御剑术I(背包),布布扣,bubuko.com

时间: 2024-11-05 12:09:47

HDU 4563 御剑术I(背包)的相关文章

HDU 2955 Robberies --01背包变形

这题有些巧妙,看了别人的题解才知道做的. 因为按常规思路的话,背包容量为浮点数,,不好存储,且不能直接相加,所以换一种思路,将背包容量与价值互换,即令各银行总值为背包容量,逃跑概率(1-P)为价值,即转化为01背包问题. 此时dp[v]表示抢劫到v块钱成功逃跑的概率,概率相乘. 最后从大到小枚举v,找出概率大于逃跑概率的最大v值,即为最大抢劫的金额. 代码: #include <iostream> #include <cstdio> #include <cstring>

HDU 4501 多维背包

小明系列故事--买年货 Time Limit: 5000/2000 MS (Java/Others) Memory Limit: 65535/32768 K (Java/Others) Total Submission(s): 2261 Accepted Submission(s): 1018 Problem Description 春节将至,小明要去超市购置年货,于是小明去了自己经常去的都尚超市. 刚到超市,小明就发现超市门口聚集一堆人.用白云女士的话说就是:"那家伙,那场面,真是人山人海,锣

HDU 2955 Robberies (01背包)

Robberies Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 11297    Accepted Submission(s): 4190 Problem Description The aspiring Roy the Robber has seen a lot of American movies, and knows that

HDU 1059 Dividing(多重背包)

HDU 1059 Dividing(多重背包) http://acm.hdu.edu.cn/showproblem.php?pid=1059 题意: 现在有价值为1,2,3,4,5,6的6种物品, 它们的数量为num[i]( 1<=i<=6 )个. 现在要问的是能否把所有的的物品分成两份且这两份物品的价值总和相同 ? 分析: 首先我们求出所有物品的价值和sum_val, 如果sum_val是奇数, 那么明显不能分. 那么sum_val为偶时, 我们令m=sum_val/2. 我能只要看看从所有

hdu 5389 dp类似背包

http://acm.hdu.edu.cn/showproblem.php?pid=5389 Problem Description Zero Escape, is a visual novel adventure video game directed by Kotaro Uchikoshi (you may hear about ever17?) and developed by Chunsoft. Stilwell is enjoying the first chapter of this

HDU 2844 Coins (组合背包)

题意   给你n种面额不同的金币和每种金币的个数  求这些金币能组合成的面额在m内有多少种 还是明显的背包问题  d[i]表示这些金币在i内能组合成的最大面额  初始化d为负无穷  d[0]=0  这样就可以保证d[i]恰好为i时才能为正值 原因可以自己想想  然后就用背包背吧  直接多重背包也可以过  但是分成多重背包和完全背包要快一点 #include<cstdio> #include<cstring> #include<algorithm> using names

hdu 2191(多重背包)

悼念512汶川大地震遇难同胞——珍惜现在,感恩生活 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 14758    Accepted Submission(s): 6229 Problem Description 急!灾区的食物依然短缺!为了挽救灾区同胞的生命,心系灾区同胞的你准备自己采购一些粮食支援灾区,现在假设你一共有资金n元,而市

HDU 2159FATE(二维背包)

题目地址:HDU 2159 二维的背包,刚开始用的一维,老感觉哪里不对,有两个制约因素.于是就改成了二维的,就过了.. 代码如下: #include <algorithm> #include <iostream> #include <cstring> #include <cstdlib> #include <cstdio> #include <queue> #include <cmath> #include <sta

HDU 1114 Piggy-Bank(完全背包 DP)

题意  知道空存钱罐的重量和装满钱的存钱罐的重量及每种币值的重量   求存钱罐里至少有多少钱 裸的完全背包  但是是求最小值  所以初始0要变成初始INF  max也要变成min #include<cstdio> #include<cstring> #include<algorithm> using namespace std; const int N = 10005, INF = 0x3f3f3f3f; int val[N], wei[N], d[N]; int ma