0-1背包问题(Java详解)(动态规划)至少与恰好

简介: 0-1背包问题(Java详解)(动态规划)至少与恰好

参考文章

动态规划问题——0/1背包问题(Java实现)

0-1背包问题(Java详解)

思路:

首先用数组weight存放重量,数组value存放价值,再使用二维数组v[][]存放动态规划的过程(如果是至少时,初始化为0,;如果是恰好时,初始化为负无穷大)。商品是从第一个往最后一个加,背包容量是从0开始到题目要求大小。若要打印对应商品,则从结果开始递推。

代码:

package text2;


import java.util.Scanner;

public class 背包问题_动态规划 {

  public static void main(String[] args) {
    // TODO Auto-generated method stub
    Scanner scanner = new Scanner(System.in);
    int capacity = scanner.nextInt();
    int n = scanner.nextInt();
    int weight[] = new int[n+1];//重量
    int value[] = new int[n+1];//价值
    for(int i=1;i<=n;i++) {
      weight[i] = scanner.nextInt();
    }
    for(int i=1;i<=n;i++) {
      value[i] = scanner.nextInt();
    }

    int v[][] = new int[n+1][capacity+1];
//    Arrays.fill(v, 0);
    
    /**
        * 使用非递归方式,求解v[0 .. N][0 .. capacity],即for循环从下至上求解
       */
    for(int i=0;i<=n;i++)
      for(int j=0;j<=capacity;j++) {//j表示背包容量
        if(i==0 || j==0) v[i][j] = 0;//初始化边界
        else {
          if(j<weight[i])
            v[i][j] = v[i-1][j];
          else {
            v[i][j] = Math.max(v[i-1][j], v[i-1][j-weight[i]]+value[i]);
          }
        }
      }
    //打印v的所有结果
    for(int i = 0; i <= n; i++) {
            for(int j = 0; j <= capacity; j++) {
                System.out.print(v[i][j] + " ");
            }
            System.out.println();
        }
    System.out.println("背包内最大的物品价值总和为:" + v[n][capacity]);
    
    //求解最大具体是有哪几个商品组成的
    int item[] = new int[n+1];
//    Arrays.fill(item, 0);// 下标i对应的物品若被选中,设置值为1
    // 从最优解,倒推回去找
    int t = capacity;
    for(int i=n;i>0;i--) {
      if(v[i][t]>v[i-1][t]) {
        item[i] = 1;
        t = t-weight[i];
      }
        
    }
    System.out.print("包内物品的编号为:");
    for (int i = 0; i < n + 1; i++) {
      if (item[i] == 1) {
        System.out.print(i + " ");
      }
    }
    
  }

}

相关文章
|
9月前
|
Java
【Java每日一题,动态规划,零钱兑换模板题】硬币组合数量
【Java每日一题,动态规划,零钱兑换模板题】硬币组合数量
|
9月前
|
Java
【Java每日一题,01背包问题】 kkksc03考前临时抱佛脚
【Java每日一题,01背包问题】 kkksc03考前临时抱佛脚
|
22小时前
|
算法 Java 决策智能
Java数据结构与算法:动态规划之背包问题
Java数据结构与算法:动态规划之背包问题
|
1月前
|
算法 Java
用Java实现01背包问题 用贪心算法
用Java实现01背包问题 用贪心算法
119 43
|
9月前
|
Java
【Java每日一题,动态规划】数字金字塔
【Java每日一题,动态规划】数字金字塔
|
1月前
|
算法 Java
给定一个字符串数组,如何找到其中最长的回文子串? 要求:编写一个Java函数,输入一个字符串数组,输出其中最长的回文子串。要求时间复杂度为O(n^2)。可以考虑使用动态规划或中心扩展的方法来优化算法。
给定一个字符串数组,如何找到其中最长的回文子串? 要求:编写一个Java函数,输入一个字符串数组,输出其中最长的回文子串。要求时间复杂度为O(n^2)。可以考虑使用动态规划或中心扩展的方法来优化算法。
59 1
|
9月前
|
Java
【Java每日一题,动态规划,Map实现】最长定差子序列
【Java每日一题,动态规划,Map实现】最长定差子序列
|
9月前
|
Java
【Java每日一题,动态规划】最长定差子序列
【Java每日一题,动态规划】最长定差子序列
|
Java
01背包问题 java完整输入输出代码
01背包问题 java完整输入输出代码
87 0
力扣322. 零钱兑换 Java动态规划
给你一个整数数组 coins ,表示不同面额的硬币;以及一个整数 amount ,表示总金额。 计算并返回可以凑成总金额所需的 最少的硬币个数 。如果没有任何一种硬币组合能组成总金额,返回 -1 。 你可以认为每种硬币的数量是无限的。
173 0
力扣322. 零钱兑换 Java动态规划