完全背包

ゞ 浴缸里的玫瑰 2022-06-08 09:43 300阅读 0赞

完全背包和01背包的区别

01背包:有n个物品,每种物品只能被使用一次

完全背包:有n个物品,每个物品可以被多次使用

完全背包的递推公式可以由01背包的递推公式扩展得到(如果背包可以装下k个weight[i])
二维:
dp[i][j] = Math.max(dp[i-1][j], dp[i-1][j-k*weight[i]] + k*value[i])
一维
dp[j] = Math.max(dp[j],dp[j-k*weight[i]]+k*value[i])
当可以放入第i件物品的时候,要尽可能多的装入第i件物品
二维代码:

  1. import java.util.Scanner;
  2. public class Wanquanbeibao {
  3. static int[][] dp;
  4. public static void main(String[] args) {
  5. Scanner in = new Scanner(System.in);
  6. int n = in.nextInt();
  7. int m = in.nextInt();
  8. int[] value = new int[n+1];
  9. int[] weight = new int[n+1];
  10. for (int i = 1; i <= n; i++) {
  11. value[i] = in.nextInt();
  12. weight[i] = in.nextInt();
  13. }
  14. dp = new int[n+1][m+1];
  15. for (int i = 1; i <= n; i++) {
  16. for (int j = 1; j <= m; j++) {
  17. for (int k = 0; k*weight[i] <= j; k++) {
  18. dp[i][j] = Math.max(dp[i-1][j], dp[i-1][j-k*weight[i]]+k*value[i]);
  19. }
  20. }
  21. }
  22. System.out.println(dp[n][m]);
  23. }
  24. }

一维代码:

  1. import java.util.Scanner;
  2. public class Wanquanbeibao1 {
  3. static int[] dp;
  4. public static void main(String[] args) {
  5. Scanner in = new Scanner(System.in);
  6. int n = in.nextInt();
  7. int m = in.nextInt();
  8. int[] value = new int[n+1];
  9. int[] weight = new int[n+1];
  10. for (int i = 1; i <= n; i++) {
  11. value[i] = in.nextInt();
  12. weight[i] = in.nextInt();
  13. }
  14. dp = new int[m+1];
  15. for (int i = 1; i <= n; i++) {
  16. //与01背包不同的是j的循环是从1到m
  17. for (int j = 1; j <= m; j++) {
  18. for (int k = 0; k*weight[i] <= j; k++) {
  19. dp[j] = Math.max(dp[j], dp[j-k*weight[i]]+k*value[i]);
  20. }
  21. }
  22. }
  23. System.out.println(dp[m]);
  24. }
  25. }

之前看到一个大牛写的很简洁的完全背包的一维代码,移步大牛代码
大牛的代码思路是不论同一个物品装入多少次,都是一次装入一个,所以问题转换成在装入第i个物品之后继续装第i种物品,以下将大神的c代码转为java代码

  1. import java.util.Scanner;
  2. public class Wanquanbeibao2 {
  3. static int[] dp;
  4. public static void main(String[] args) {
  5. Scanner in = new Scanner(System.in);
  6. int n = in.nextInt();
  7. int m = in.nextInt();
  8. int[] value = new int[n+1];
  9. int[] weight = new int[n+1];
  10. for (int i = 1; i <= n; i++) {
  11. value[i] = in.nextInt();
  12. weight[i] = in.nextInt();
  13. }
  14. dp = new int[m+1];
  15. for (int i = 1; i <= n; i++) {
  16. for (int j = 1; j <= m; j++) {
  17. //与01背包唯一的不同点
  18. if(j >= weight[i])
  19. dp[j] = Math.max(dp[j], dp[j-weight[i]]+value[i]);
  20. }
  21. }
  22. System.out.println(dp[m]);
  23. }
  24. }

与01背包的不同仅仅是j的遍历方向。

发表评论

表情:
评论列表 (有 0 条评论,300人围观)

还没有评论,来说两句吧...

相关阅读

    相关 背包DP | 完全背包问题

    > 完全背包问题:有n种物品,每一件的物品重量为 w\[ i \],价值为 c\[ i \]。现有一个容量为V的背包 (背包的最大承重为V),问如何选取物品放入背包,使得背包内

    相关 完全背包

    完全背包在背包九讲中有很详细的讲解,但是今天碰到题尝试了一下他给的算法,发现并不快,看了一下其他的代码,速度很快! 题目链接http://hihocoder.com/prob

    相关 完全背包问题

    1. 问题描述 有 N 种物品, 物品 i 的重量为 wi, 价格为 vi, 背包所能承受的最大重量为 W。 其中, N,W,wi,vi≥0 若每种物品仅有一件,

    相关 01背包,完全背包

    01背包问题:一个背包总容量为V,现在有N个物品,第i个 物品体积为weight\[i\],价值为value\[i\],现在往背包里面装东西,怎么装能使背包的内物品价值最大?

    相关 完全背包

    完全背包和01背包的区别 > 01背包:有n个物品,每种物品只能被使用一次 > > 完全背包:有n个物品,每个物品可以被多次使用 完全背包的递推公式可以由01背包的递推公

    相关 完全背包

    问题: 有N种物品和一个容量为V的背包,每种物品都有无限件可用。第i种物品的费用是c\[i\],价值是w\[i\]。求解将哪些物品装入背包可使这些物品的费用总和不超过背包容量

    相关 0-1背包&完全背包

    First:0-1背包问题 1.定义define: 所谓的0-1背包就是指每种物品只有一件,而每件物品只有两种选择,即选择放或是不放 2.问题: 一个小偷来出来活动