UVALive 4870 Roller Coaster --01背包

题意:过山车有n个区域,一个人有两个值F,D,在每个区域有两种选择:

1.睁眼: F += f[i], D += d[i]

2.闭眼: F = F ,     D -= K

问在D小于等于一定限度的时候最大的F。

解法: 用DP来做,如果定义dp[i][j]为前 i 个,D值为j的情况下最大的F的话,由于D值可能会增加到很大,所以是存不下的,又因为F每次最多增加20,那么1000次最多增加20000,所以开dp[1000][20000],dp[i][j]表示前 i 个,F值为j的情况下最小的D。

然后就是简单的01背包了。也可以转化为一维背包。

代码:

#include <iostream>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <cmath>
#include <algorithm>
#define Mod 1000000007
using namespace std;

int dp[1006][20005];
int F[1006],D[1006];

int main()
{
    int n,K,Limit,i,j,FV;
    while(scanf("%d%d%d",&n,&K,&Limit)!=EOF && n+K+Limit)
    {
        FV = 0;
        for(i=1;i<=n;i++) { cin>>F[i]>>D[i]; FV += F[i]; }
        for(i=0;i<=n;i++) {
            for(j=0;j<=FV;j++)
                dp[i][j] = Mod;
        }
        dp[0][0] = 0;
        for(i=1;i<=n;i++) {
            for(j=0;j<=FV;j++) {
                dp[i][j] = min(dp[i][j],max(0,dp[i-1][j]-K));
                if(j >= F[i] && dp[i-1][j-F[i]]+D[i] <= Limit)
                    dp[i][j] = min(dp[i][j],dp[i-1][j-F[i]]+D[i]);
            }
        }
        int maxi = 0;
        for(i=0;i<=FV;i++) {
            if(dp[n][i] <= Limit)
                maxi = max(maxi,i);
        }
        cout<<maxi<<endl;
    }
    return 0;
}

时间: 2024-10-13 15:20:04

UVALive 4870 Roller Coaster --01背包的相关文章

POJ - 3257 Cow Roller Coaster (背包)

题目大意:要用N种材料建一条长为L的路,现在给出每种材料的长度w,起始地点x,发费c和耐久度f 问:在预算为B的情况下,建好这条路的最大耐久度是多少 解题思路:背包问题 dp[i][j]表示起始地点为i,发费为j的最大耐久度 可得转移方程 dp[i + w][j + c] = max(dp[i + w][j + c],dp[i][j] + f) #include<cstdio> #include<cstring> #include<algorithm> using na

uvalive 4015 洞穴cave(树的dp/01背包)

题意:一棵n(n<=500)个节点的有根树,树的边有正整数权,表示两个节点之间的距离,你的任务是回答这样的询问,从根节点出发,走不超过x(x<=5000000)单位的距离,最多能走多少个节点,节点经过多次算一个,对于每次的询问(群文次数小于1000)输出:经过节点数最大的值. 注意题目给出的  i, j,d,其中 j 是 i 的父节点. 这道题想了两天,看了题解一开始也不明白(泪目),后来一想可以当成树上的01背包来做,终于ac,这应该是目前做的最难的一道动态规划题了. 思路是:这道题的难点之

【题解】P2854 [USACO06DEC]牛的过山车Cow Roller Coaster

P2854 [USACO06DEC]牛的过山车Cow Roller Coaster 题目描述 The cows are building a roller coaster! They want your help to design as fun a roller coaster as possible, while keeping to the budget. The roller coaster will be built on a long linear stretch of land o

UVALive 5066 Fire Drill BFS+背包

H - Fire Drill Time Limit:3000MS     Memory Limit:0KB     64bit IO Format:%lld & %llu Submit Status Practice UVALive 5066 Description Joko is taking part in a fire drill which is held by the Jakarta Fire Department to recruit new firemen. The drill i

BZOJ 1649: [Usaco2006 Dec]Cow Roller Coaster( dp )

有点类似背包 , 就是那样子搞... ------------------------------------------------------------------------------------ #include<cstdio> #include<cstring> #include<algorithm> #include<iostream> #define rep( i , n ) for( int i = 0 ;  i < n ; ++i

UVA 562 Dividing coins --01背包的变形

01背包的变形. 先算出硬币面值的总和,然后此题变成求背包容量为V=sum/2时,能装的最多的硬币,然后将剩余的面值和它相减取一个绝对值就是最小的差值. 代码: #include <iostream> #include <cstdio> #include <cstring> #include <cmath> #include <algorithm> using namespace std; #define N 50007 int c[102],d

17-又见01背包

/*                                        又见01背包时间限制:1000 ms  |  内存限制:65535 KB难度:3 描述        有n个重量和价值分别为wi 和 vi 的 物品,从这些物品中选择总重量不超过 W     的物品,求所有挑选方案中物品价值总和的最大值.    1 <= n <=100    1 <= wi <= 10^7    1 <= vi <= 100    1 <= W <= 10^

HDU - 2602 Bone Collector(01背包讲解)

题意:01背包:有N件物品和一个容量为V的背包.每种物品均只有一件.第i件物品的费用是volume[i],价值是value[i],求解将哪些物品装入背包可使价值总和最大. 分析: 1.构造二维数组:dp[i][j]---前i件物品放入一个容量为j的背包可以获得的最大价值. dp[i][j] = max(dp[i - 1][j], dp[i - 1][j - volume[i]] + value[i]);---(a) (1)dp[i - 1][j]---不放第i件物品,因此前i件物品放入一个容量为

01背包

这里就只放自己刷的题目了,毕竟是弱弱哒 HDU2546:饭卡 1 #include <algorithm> 2 #include <cstdio> 3 4 using namespace std; 5 6 int main() 7 { 8 int n,m; 9 while (~scanf("%d", &n), n) 10 { 11 int f[2013] = {0}, menu[2013] = {0}; 12 for (int i = 1; i <