zvvq技术分享网

LeetCode Day动态编程第31部分(leetcode动态规划)

作者:zvvq博客网
导读0-1 袋子问题 主题描述 Ming 是一位科学家,他需要参加一个重要的国际科学会议来展示他的最新研究成果。他需要带一些研究资料,但他的行李箱空间有限。这些研究资料包括实验设备

zvvq.cn

0-1 袋子问题

主题描述

内容来自samhan

Ming 是一位科学家,他需要参加一个重要的国际科学会议来展示他的最新研究成果。他需要带一些研究资料,但他的行李箱空间有限。这些研究资料包括实验设备、文献、实验样本等,各自占据不同的空间,具有不同的价值。

copyright zvvq

Ming的行李空间为N。问Ming应该如何选择携带最有价值的研究资料。每个研究材料只能选择一次,并且只有选择或不选择两种选择,并且不能进行裁剪。 内容来自zvvq,别采集哟

输入描述 内容来自zvvq,别采集哟

第一行包含两个正整数,第一个整数M代表研究材料的类型,第二个正整数N代表Ming的行李空间。

第二行包含 M 个正整数,代表每种研究材料占用的空间。

本文来自zvvq

第三行包含M个正整数,代表每个研究材料的价值。

zvvq.cn

输出描述

zvvq

输出一个整数,代表Ming可以携带的研究材料的最大值。

输入示例

内容来自samhan

6 1

zvvq

2 2 3 1 5 2 内容来自zvvq,别采集哟

2 3 1 5 4 3

输出示例

内容来自samhan666

5

提示

copyright zvvq

小明可以携带6个研究材料,但行李空间只有1个,而占用1个空间的研究材料价值5个,所以最终答案是输出5。

数据范围:

内容来自zvvq

1 1 研究材料占用空间和研究材料价值均小于等于1000。 内容来自zvvq,别采集哟

1 内容来自samhan666

2 内容来自zvvq,别采集哟

3 内容来自zvvq,别采集哟

4 copyright zvvq

5 内容来自zvvq

6 copyright zvvq

7

copyright zvvq

8 内容来自samhan

9

zvvq.cn

10 内容来自samhan666

11

zvvq.cn

12

zvvq

13 内容来自zvvq

14

内容来自samhan666

15 zvvq

16 zvvq

17 zvvq

18 内容来自zvvq,别采集哟

19

copyright zvvq

20 zvvq

21

zvvq.cn

22 zvvq.cn

23 内容来自zvvq

24 本文来自zvvq

25

zvvq.cn

26

本文来自zvvq

27

内容来自zvvq

28

内容来自zvvq,别采集哟

29

zvvq好,好zvvq

30 内容来自zvvq

31 内容来自samhan666

32 zvvq好,好zvvq

33 copyright zvvq

34

zvvq.cn

35

内容来自samhan

公开课主{ zvvq.cn

公共静态无效主(字符串[]参数){

zvvq.cn

/* 代码 */

zvvq好,好zvvq

扫描仪 s = new Scanner(System.in); 内容来自zvvq

int M = s.nextInt();

zvvq.cn

int N = s.nextInt(); zvvq

// 清除缓冲区符号 /n

内容来自zvvq,别采集哟

s.nextLine(); zvvq

字符串 w = s.nextLine(); zvvq

字符串 v = s.nextLine();

copyright zvvq

int[] 权重 = Arrays.stream(w.split(" "))

copyright zvvq

.mapToInt(整数::valueOf) 本文来自zvvq

.toArray(); 内容来自samhan666

int[] value = Arrays.stream(v.split(" ")) 内容来自zvvq,别采集哟

.mapToInt(整数::valueOf) copyright zvvq

.toArray();

本文来自zvvq

int[][] dp = 新 int[M][N+1];

内容来自zvvq,别采集哟

for(int i=权重[0]; i j){

内容来自samhan

dp[i][j] = dp[i-1][j];

内容来自zvvq

}别的{ 内容来自samhan666

dp[i][j] = Math.max(dp[i - 1][j], dp[i - 1][j - 权重[i]] + 值[i]); zvvq

}

copyright zvvq

}

本文来自zvvq

}

内容来自zvvq

System.out.println(dp[M-1][N]); 内容来自samhan666

}

copyright zvvq

} 内容来自zvvq,别采集哟

1,dp数组意味着我们可以获得item i和目标bag size j的最大值。行表示物品,列表示包的尺寸。

内容来自zvvq

2,对于init,我们初始化第一行和第一列(但实际上我们默认初始化列为0,这意味着) 内容来自samhan

3,回归关系为:对于每一项: zvvq.cn

a、如果物品的重量大于包的尺寸,则无法选择该物品,当前尺寸为之前选择的物品集合的尺寸。 zvvq

b、如果物品的重量可以,我们必须比较之前选择的物品的集合的大小减去当前物品的大小(如果我们不这样做,则总大小将是大小 + 大小当前项目的,它将破坏我们的 dp 数组的逻辑)。

这里,是双循环的顺序,因为我们可以用一个二维数组来记录所有结果,从上一行开始查找当前行。

zvvq好,好zvvq

另外,我们可以使用一维数组来实现。

1

copyright zvvq

2

本文来自zvvq

3

内容来自samhan666

4 zvvq好,好zvvq

5

本文来自zvvq

6 内容来自zvvq,别采集哟

for(int i=1; i<m i for j="1;" if> j){ zvvq好,好zvvq

dp[i][j] = dp[i-1][j];

copyright zvvq

}别的{ 内容来自samhan666

dp[i][j] = Math.max(dp[i - 1][j], dp[i - 1][j - 权重[i]] + 值[i]);

内容来自zvvq,别采集哟

} 本文来自zvvq

</m> zvvq.cn

改成

1

zvvq好,好zvvq

int[] dp = new int[target+1]; zvvq

1 本文来自zvvq

2 zvvq好,好zvvq

3

内容来自samhan

4 copyright zvvq

5 内容来自samhan

6

zvvq.cn

7

zvvq.cn

8

内容来自zvvq

for(int i=1; i<nums.length i for j="目标;">=1; j--){

copyright zvvq

if(nums[i] &gt; j){

内容来自zvvq,别采集哟

继续;

zvvq.cn

}

zvvq.cn

dp[j] = Math.max(dp[j], dp[j-nums[i]] + nums[i]);   

本文来自zvvq

}

内容来自samhan

} 本文来自zvvq

</nums.length>

zvvq.cn

416. 划分子集和相等

给定一个整数数组 nums,如果可以将数组划分为两个子集,使得两个子集中的元素之和相等,则返回 true,否则返回 false。 zvvq好,好zvvq

示例1:

zvvq.cn

输入:nums = [1,5,11,5] 内容来自zvvq,别采集哟

输出:true 本文来自zvvq

说明:数组可以分为 [1, 5, 5] 和 [11]。

内容来自zvvq,别采集哟

示例2:

输入:nums = [1,2,3,5] zvvq好,好zvvq

输出:假 内容来自samhan

说明:数组不能划分为等和子集。

限制: zvvq.cn

1 1 原始页面

zvvq

1 copyright zvvq

2

zvvq

3 内容来自samhan

4 zvvq

5 zvvq

6

内容来自samhan666

7 zvvq

8

zvvq

9

zvvq好,好zvvq

10 本文来自zvvq

11 内容来自samhan

12

本文来自zvvq

13 内容来自zvvq,别采集哟

14 内容来自zvvq,别采集哟

15

内容来自zvvq

16

内容来自samhan666

17 copyright zvvq

18

copyright zvvq

19

内容来自samhan666

public boolean canPartition(int[] nums) { zvvq.cn

int sum = Arrays.stream(nums).sum(); zvvq好,好zvvq

如果(总和%2==1){ zvvq好,好zvvq

返回假;

内容来自zvvq,别采集哟

}

内容来自samhan

int 目标=总和&gt;&gt;1; zvvq好,好zvvq

int[][] dp = new int[nums.length][目标+1]; 内容来自zvvq,别采集哟

for(int i=nums[0]; i j){

copyright zvvq

dp[i][j] = dp[i-1][j];

copyright zvvq

}别的{

内容来自zvvq

dp[i][j] = Math.max(dp[i-1][j], dp[i-1][j-nums[i]] + nums[i]);

内容来自samhan666

}    

copyright zvvq

} 内容来自samhan

} zvvq

返回 dp[nums.length-1][目标] == 目标; 

内容来自zvvq

}

本文来自zvvq

以上就是LeetCode Day动态编程第31部分的详细内容,更多请关注其它相关文章!

内容来自zvvq,别采集哟