計算客/节食的限制(01背包)

題目鏈接: https://nanti.jisuanke.com/t/227

題意:中文題誒~

思路:01背包

類似的題: http://www.cnblogs.com/geloutingyu/p/6279279.html

用dp[i][j]表示到地 i 個數能得到的不大於 j 的最大的數, 顯然有 dp[i-1][j-a[i]]+a[i] 爲選擇第 i 個與元素能得到的不大於 j 的最大的數, 那麼有動態轉移方程:

if(j>=a[i]) dp[i][j]=max(dp[i-1][j], dp[i-1][j-a[i])+a[i])

else dp[i][j]=max(dp[i][j], dp[i-1][j])

然而本題有空間限制, 開不了二維, 那也簡單. 從上面的動態轉移方程式可以發現只用了上一層循環的數據, 顯然前面的數據是可以不用存儲的;

用dp[j]存儲到當前元素可以得到的不大於 j 的最大的數, 顯然當前數組存儲的是上一層循環的數據, 那麼只要從後往前用本層循環的數據覆蓋上層數據即可;

動態轉移方程式爲:

dp[j]=max(dp[j], dp[j-x]+x]

代碼:

 1 #include <iostream>
 2 #include <stdio.h>
 3 using namespace std;
 4
 5 const int MAXN=1e5+10;
 6 int dp[MAXN];//dp[j]存儲前i個元素能達到不大於j的最大值
 7
 8 int main(void){
 9     int x, h, n, ans=0;
10     scanf("%d%d", &h, &n);
11     for(int i=1; i<=n; i++){
12         scanf("%d", &x);
13         for(int j=h; j>=x; j--){
14             dp[j]=max(dp[j], dp[j-x]+x);
15         }
16     }
17     printf("%d\n", dp[h]);
18     return 0;
19 }

时间: 2024-10-08 08:21:18

計算客/节食的限制(01背包)的相关文章

計算客/小教官(xjb)

題目鏈接:https://nanti.jisuanke.com/t/366 題意:中文題誒~ 思路: 先通過給出的條件構造一個符合題意的數組(可以是任意一個符合條件的數組,菜雞不會證明: 然後構造的數組和初始序列1, 2, 3, 4...n最少不同元素的個數就是答案: 這點是比較好理解的:題目中給出的b1, b2, ...bm可以是不連續的, 那麼如果每次選擇的m個與初始序列不同位置的元素並且通過一次操作後可以到達初始序列所在位置: 那麼所需代價肯定是最小的,總代價即爲位置不同的元素的數目. 所

0-1背包的动态规划算法,部分背包的贪心算法和DP算法------算法导论

一.问题描述 0-1背包问题,部分背包问题.分别实现0-1背包的DP算法,部分背包的贪心算法和DP算法. 二.算法原理 (1)0-1背包的DP算法 0-1背包问题:有n件物品和一个容量为W的背包.第i件物品的重量是w[i],价值是v[i].求解将哪些物品装入背包可使这些物品的费用总和不超过背包容量,且价值总和最大.其中每种物品只有一件,可以选择放或者不放. 最优子结构性质:对于0-1问题,考虑重量至多W的最值钱的一包东西.如果去掉其中一个物品j,余下的必是除j以外的n-1件物品中,可以带走的重量

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

poj 2184 Cow Exhibition(01背包)

Cow Exhibition Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 10882   Accepted: 4309 Description "Fat and docile, big and dumb, they look so stupid, they aren't much fun..." - Cows with Guns by Dana Lyons The cows want to prove to

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

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

poj(2184)——Cow Exhibition(01背包变形)

其实我想说这道题我觉得我自己并没有深刻的理解.但是今天做了一下,先把现在的想法记录下来 . 题目的大致意思是: 有N头牛,每头牛都有一个s值代表智商值,f值代表它的幽默值. 然后问你智商值和幽默值的总和值最大是多少,其中必须保证智商值的和与幽默值的和为非负数. 一开始我想到的也是01背包,但是这里还有负值,于是我就没有办法了.于是学习到了一个相当于把坐标平移的方法. 因为这里有-1000到0的值,于是我们把它们全都移到右边去,于是变成了非负值0-2000. 解法: 01背包. 但是要注意的是当x

hdu 1561The more, The Better(树形dp&amp;01背包)

The more, The Better Time Limit: 6000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 4949    Accepted Submission(s): 2918 Problem Description ACboy很喜欢玩一种战略游戏,在一个地图上,有N座城堡,每座城堡都有一定的宝物,在每次游戏中ACboy允许攻克M个城堡并获得里面的宝

POJ 3624 Charm Bracelet(01背包裸题)

Charm Bracelet Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 38909   Accepted: 16862 Description Bessie has gone to the mall's jewelry store and spies a charm bracelet. Of course, she'd like to fill it with the best charms possible fro

有关货币问题的动态规划题目--有关01背包,完全背包,多重背包

背包dp:参考背包九讲以及给出一些题目 01背包 (先枚举物品,再逆序枚举容量) 给定n件物品和一个容量为V的背包,每件物品的体积是w[i],价值是va[i](1<=i<=n),求在不超过背包的容量的情况下,怎么选择装这些物品使得得到的价值最大? 例如:有5件物品,体积分别是{2,2,6,5,4},价值分别是{6,3,5,4,6} 递归式:F(i,v)=max(F(i-1,v), F(i-1,v-w[i])+va[i]),其中F(i,v)表示把前i种物品恰放入背包容量为v时取得的最大价值 把这