RQNOJ 329 刘翔!加油!:01背包

题目链接:https://www.rqnoj.cn/problem/329

题意:

  刘翔有n封信,每封信都有自己的欣赏价值value[i]、消耗时间time[i]、消耗体力h[i]、和得到的鼓舞w[i]。

  观看信件必须按照价值递增(大于)的顺序观看,不一定需要全看。

  可是,刘翔在伤病中,时间和体力分别为t,m,同时看完之后体力不能为0。

  问你受到的鼓舞最大为多少。

题解:

  这道题里value[i]真的没有用。。。

  

  表示状态:

    dp[i][j][k] = max encouraging

    i:考虑到第i封信

    j:花费的时间

    k:花费的体力

  找出答案:

    ans = max dp[i][j][k] (0<=j<=t, 0<=k<m)

  如何转移:

    dp[i][j][k] = max(dp[i-1][j][k], dp[i-1][j-c[i]][k-h[i]] + w[i]) (01背包)

  边界条件:

    set dp = 0

AC Code:

 1 // state expression:
 2 // dp[i][j][k] = max encouraging
 3 // i: ith letter was considered
 4 // j: time cost
 5 // k: hp cost
 6 //
 7 // find the answer:
 8 // max dp[i][j][k] (0<=j<=t, 0<=k<m)
 9 //
10 // transferring:
11 // dp[i][j][k] = max(dp[i-1][j][k], dp[i-1][j-c[i]][k-h[i]] + w[i])
12 //
13 // boundary:
14 // set dp = 0
15 #include <iostream>
16 #include <stdio.h>
17 #include <string.h>
18 #define MAX_N 105
19 #define MAX_T 105
20 #define MAX_H 105
21
22 using namespace std;
23
24 int n,m,t;
25 int ans;
26 int w[MAX_N];
27 int c[MAX_N];
28 int h[MAX_N];
29 int dp[MAX_N][MAX_T][MAX_H];
30
31 void read()
32 {
33     cin>>n>>m>>t;
34     int v;
35     for(int i=1;i<=n;i++)
36     {
37         cin>>v>>c[i]>>h[i]>>w[i];
38     }
39 }
40
41 void solve()
42 {
43     memset(dp,0,sizeof(dp));
44     ans=0;
45     for(int i=1;i<=n;i++)
46     {
47         for(int j=0;j<=t;j++)
48         {
49             for(int k=0;k<m;k++)
50             {
51                 dp[i][j][k]=max(dp[i][j][k],dp[i-1][j][k]);
52                 if(j-c[i]>=0 && k-h[i]>=0)
53                 {
54                     dp[i][j][k]=max(dp[i][j][k],dp[i-1][j-c[i]][k-h[i]]+w[i]);
55                 }
56                 ans=max(ans,dp[i][j][k]);
57             }
58         }
59     }
60 }
61
62 void print()
63 {
64     cout<<ans<<endl;
65 }
66
67 int main()
68 {
69     read();
70     solve();
71     print();
72 }
时间: 2024-08-02 06:59:20

RQNOJ 329 刘翔!加油!:01背包的相关文章

RQNOJ 202 奥运火炬登珠峰:01背包

题目链接:https://www.rqnoj.cn/problem/202 题意: 登珠峰需要携带a(L)O2和t(L)N2. 有n个气缸可供选择.其中第i个气缸能装下a[i](L)O2和t[i](L)N2,气缸重量为w[i]. 问你在满足需求的前提下,最小的气缸总重量为多少. 题解: 二重01背包. 表示状态: dp[i][j][k]表示考虑到第i个气缸(还没选),已经能装下j(L)O2和k(L)N2. dp[i][j][k] = 此时的最小总重量 找出答案: min dp[i][j][k]

uva10201 - Adventures in Moving - Part IV(01背包)

题目:uva10201 - Adventures in Moving - Part IV(01背包) 题目大意:一辆车要走D距离,然后它有个200L油箱,并且一开始有100L,现在给你一路上你会遇到的加油站,和这个加油站每升油的价钱,要求你最后到终点的时候油需要大于等于100L,问你加油最少的费用.如果到达不了目标地点就输出Impossible. 解题思路:首先要先到达这个加油站,然后就相当这个加油站你选不选择加油,选择加油了那么又要加多少油.dp[j][i]代表到达第i个加油站还有jL油,dp

hdu(5389)——Zero Escape(01背包变形)

啊,这是一道挺不错的动态规划的题目呢. 一开始我们并没有找出规律,后来队友突然喊了一句:"dp啊!" 顿时人生豁然开朗了... 于是她很神奇的推出了转移方程,然后再共同查错下,a出了这道题,真是佩服这人的高智商啊 题意: 首先n,代表的是n个人,然后是A,B,分别代表两个门的值. 然后第二行给出了n个人的价值,问你要使这n个人全部进入门中(可以是A,B,或是其中的一扇门),总共有几种方法. 但是要注意这里的价值并不是仅仅加起来就好了,这里是要把它加起来直到为一个个位数. 思路: 定义:

hdu3448 01背包+dfs

题目链接:http://acm.split.hdu.edu.cn/showproblem.php?pid=3448 Description 0/1 bag problem should sound familiar to everybody. Every earth man knows it well. Here is a mutant: given the capacity of a bag, that is to say, the number of goods the bag can ca

动态规划-01背包

先认错,学长们很早之前就讲过了,然而我现在才来写... 01背包 01背包是在M件物品取出若干件放在空间为W的背包里,每件物品的体积为W1,W2--Wn,与之相对应的价值为P1,P2--Pn. 01背包题目的雏形是: 有N件物品和一个容量为V的背包.第i件物品的费用是c[i],价值是w[i].求解将哪些物品装入背包可使价值总和最大. 从这个题目中可以看出,01背包的特点就是:每种物品仅有一件,可以选择放或不放. 其状态转移方程是: f[i][v]=max{f[i-1][v],f[i-1][v-c

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 <