01背包--动态规划

https://i.cnblogs.com/EditPosts.aspx?opt=1

这里主要是想改进一下二维数组的做法,用一维数组来实现01背包,也叫做滚动数组!

先借用某位大牛的一句话:“01背包在二维数组上操作,就是为了防止一个物品被放入多次的情况“

但其实01背包也可以用一维数组来做啦!

这里是把状态只用一维数组来表示,dp[j]表示放到第j个物品(或者说是前j个物品)的时候的最大价值,少了一维,感觉好神奇...不过在我仅仅做过的题目中,好像有很多都是用滚动数组的形式...

好了,用回当年的辣个栗子:

----------------------------------------

让我假设现在的背包的容量是C=10;

物品编号: 1 2 3

物品重量: 5 6 4

物品价值:20 10 12

---------------------------------------

直接分析dp数组:

dp:0 0 0 0 0 0 0 0 0 0

i=1:

dp[10] = max(dp[5]+20, dp[10]);

dp[9] = max(dp[4]+20, dp[9]);

dp[8] = max(dp[3]+20, dp[8]);

dp[7] = max(dp[2]+20, dp[7]);

dp[6] = max(dp[1]+20, dp[6]);

dp[5] = max(dp[0]+20, dp[5]);

dp: 0 0 0 0 20 20 20 20 20 20

---------------------------------------------

i=2:

dp[10] = max(dp[6]+4, dp[10]);

dp[9] = max(dp[3]+10, dp[9]);

dp[8] = max(dp[2]+10, dp[8]);

dp[7] = max(dp[1]+10, dp[7]);

dp[6] = max(dp[0]+10, dp[6]);

dp: 0 0 0 0 20 20 20 20 20 20 //看到了没,选10的都被之前的20压下去了

-------------------------------------------

i=3:

dp[10] = max(dp[6]+12, dp[10]);

dp[9] = max(dp[5]+12, dp[9]);

dp[8] = max(dp[4]+12, dp[8]);

dp[7] = max(dp[3]+12, dp[7]);

dp[6] = max(dp[2]+12, dp[6]);

dp[5] = max(dp[1]+12, dp[5]);

dp[4] = max(dp[0]+12, dp[4]);

dp: 0 0 0 12 20 20 20 20 32 32

Hiho

输入

每个测试点(输入文件)有且仅有一组测试数据。

每组测试数据的第一行为两个正整数N和M,表示奖品的个数,以及小Ho手中的奖券数。

接下来的n行描述每一行描述一个奖品,其中第i行为两个整数need(i)和value(i),意义如前文所述。

测试数据保证

对于100%的数据,N的值不超过500,M的值不超过10^5

对于100%的数据,need(i)不超过2*10^5, value(i)不超过10^3

输出

对于每组测试数据,输出一个整数Ans,表示小Ho可以获得的总喜好值。

样例输入

5 1000
144 990
487 436
210 673
567 58
1056 897

样例输出

2099

import java.util.*;
public class Main {
public static void main(String[] args)
{
//用一维数组实现
Scanner sc=new Scanner(System.in);
int n,m;
n=sc.nextInt();
m=sc.nextInt();
int need[] =new int[n];
int val[]=new int[n];
int f[]=new int[m+1];
for(int i=0;i<n;i++)
{
need[i]=sc.nextInt();
val[i]=sc.nextInt();
}
for(int i=0;i<n;i++)
{
for(int j=m;j>=need[i];j--)
{
f[j]=Math.max(f[j],f[j-need[i]]+val[i]);
}
}
System.out.println(f[m]);
}
}

时间: 2024-10-17 15:53:42

01背包--动态规划的相关文章

01背包 -- 动态规划的入门题目

<strong><span style="font-size:18px;">首先说什么是动态规划: 经常听到 DP: Dynamic Programming的缩写 这里的入门题是这样的: 01背包 有重量与价值分别为Wi 和 Vi的 n 个物品.请从中选出物品,在重量综合不超过w的前提下,求出价值最大的. 样例: input: n = 4 (w, v) = {(2.3), (1, 2), (3, 4), (2, 3)} W = 5 outtput: 7(选择的是

HDU246饭卡(01背包/动态规划)

动态规划的题总是 看完别人的代码自己理解着打,今天自己终于自己打一回,遇到了一点问题,不过解决后发现现在理解更透彻了. Problem Description 电子科大本部食堂的饭卡有一种很诡异的设计,即在购买之前判断余额.如果购买一个商品之前,卡上的剩余金额大于或等于5元,就一定可以购买成功(即使购买后卡上余额为负),否则无法购买(即使金额足够).所以大家都希望尽量使卡上的余额最少.某天,食堂中有n种菜出售,每种菜可购买一次.已知每种菜的价格以及卡上的余额,问最少可使卡上的余额为多少. Inp

hiho#1038 : 01背包 (动态规划)

#1038 : 01背包 时间限制:20000ms 单点时限:1000ms 内存限制:256MB 描述 且说上一周的故事里,小Hi和小Ho费劲心思终于拿到了茫茫多的奖券!而现在,终于到了小Ho领取奖励的时刻了! 小Ho现在手上有M张奖券,而奖品区有N件奖品,分别标号为1到N,其中第i件奖品需要need(i)张奖券进行兑换,同时也只能兑换一次,为了使得辛苦得到的奖券不白白浪费,小Ho给每件奖品都评了分,其中第i件奖品的评分值为value(i),表示他对这件奖品的喜好值.现在他想知道,凭借他手上的这

01背包动态规划

有n 个物品,它们有各自的重量和价值,现有给定容量的背包,如何让背包里装入的物品具有最大的价值总和? 动态规划与分治法类似,都是把大问题拆分成小问题,通过寻找大问题与小问题的递推关系,解决一个个小问题,最终达到解决原问题的效果.但不同的是,分治法在子问题和子子问题等上被重复计算了很多次,而动态规划则具有记忆性,通过填写表把所有已经解决的子问题答案纪录下来,在新问题里需要用到的子问题可以直接提取,避免了重复计算,从而节约了时间,所以在问题满足最优性原理之后,用动态规划解决问题的核心就在于填表,表填

0-1背包 动态规划

给定n种物品和一个背包,物品i的重量是wi,价值vi,背包的重量是C,问如何选择装入背包的物品,使装入背包中的物品总价值最大? 对于每种物品只能选择完全装入或不装入,一个物品至多装入一次. 输入:整数C>0,整数wi>0,vi>0,1≤i≤n 输出:(x1,x2,....,xn),xi∈{0,1},满足∑1≤i≤nwixi≤C最大 问题优化子结构 Pi=[{i,i+1,.......,n},Ci=C?∑1≤k≤i?1wkxk] 代表物品1-i?1已经考虑完毕,物品i-n还没有被考虑是否被

动态规划01背包记录

01背包是动态规划的一种类型其主要的形式是: 1.所有类型物品每种类型只有一个 2.一次只能取一个且物品不能分割 3.只有取或者不取(所以叫01背包,就是只有这两种情况) 4.在背包容量不满的前提下尽可能多的装入最大价值的物品 设背包的容量为V,第i个物品的重量为weigh[i]对应的价值为price[i];  设容量为j(j的最大值为背包的容量)的背包所能装的最大价值为dp[j] n为所有的物品个数,我们先从第1个数据开始,则此物品重量为weigh[1],则我们将所有大于weigh[1]的背包

01背包和动态规划

做了一段时间NOI,做到动态规划看了几天算法书籍.还是没有深入,学了基本的动态规划,稍有一点体会,记录到这里. 背包是这样一类问题:在限定总质量前提下,从若干质量\价格对中,取哪些能使得价格最大. 动态规划是一种思想,简单的说,动态规划思想就是充分利用对子问题的计算结果来递推父问题结果.所以,动态规划具有较高的效率,省去了一些不必要的计算.这里主要关心表和递推关系,其实这两者是同一个东西,根据记录表来推得父问题的解,找到递推关系要依赖表记录子问题的解.不同的问题有不同的构建方式,所以我个人觉得,

hihoCoder - 1038 - 01背包 (经典动态规划问题!!)

#1038 : 01背包 时间限制:20000ms 单点时限:1000ms 内存限制:256MB 描述 且说上一周的故事里,小Hi和小Ho费劲心思终于拿到了茫茫多的奖券!而现在,终于到了小Ho领取奖励的时刻了! 小Ho现在手上有M张奖券,而奖品区有N件奖品,分别标号为1到N,其中第i件奖品需要need(i)张奖券进行兑换,同时也只能兑换一次,为了使得辛苦得到的奖券不白白浪费,小Ho给每件奖品都评了分,其中第i件奖品的评分值为value(i),表示他对这件奖品的喜好值.现在他想知道,凭借他手上的这

动态规划/0-1背包

每年毕业的季节都会有大量毕业生发起狂欢,好朋友们相约吃散伙饭,网络上称为"bg".参加不同团体的bg会有不同的感觉,我们可以用一个非负整数为每个bg定义一个"快乐度".现给定一个bg列表,上面列出每个bg的快乐度.持续长度.bg发起人的离校时间,请你安排一系列bg的时间使得自己可以获得最大的快乐度.    例如有4场bg:    第1场快乐度为5,持续1小时,发起人必须在1小时后离开:    第2场快乐度为10,持续2小时,发起人必须在3小时后离开:    第3场快