首页 > 代码库 > 动态规划算法实现部分——0/1背包问题
动态规划算法实现部分——0/1背包问题
代码:
import java.util.*; import java.util.Scanner; /* *动态规划思想解决0/1背包问题 */ public class Main{ public static void main(String[] args){ Scanner in=new Scanner(System.in); System.out.println("输入背包的容量"); int bagCap=in.nextInt(); //背包的容量 System.out.println("总共有多少个物品"); int n=in.nextInt(); //总共有多少个物品 int[][] mono=new int[2][n]; // 2行n列,第一行表示物品的重量,第二行表示物品的价值 int[][] dp=new int[n][bagCap+1]; //表,数组下标从0开始,加1防止数组溢出 System.out.println("依次输入物品的重量和价值"); for(int i= 0;i<n;i++){ mono[0][i]=in.nextInt(); mono[1][i]=in.nextInt(); } //自低向上打表,先初始化最低层,最低层应该是数组中的倒数第一行,对应的数组下标就是n-1 for(int j=0;j<=Math.min(mono[0][n-1]-1,bagCap);j++){ dp[n-1][j]=0; } for(int j=mono[0][n-1];j<=bagCap;j++){ dp[n-1][j]=mono[1][n-1]; } //开始自低向上打表,要始终记住数学符号的含义:dp[i][j] 表示可选物品是i,i+1,.......,n,背包容量是j时问题的最优解 for(int i=n-2;i>=1;i--){ for(int j=0;j<Math.min(mono[0][i]-1,bagCap);j++){ dp[i][j]=dp[i+1][j]; } for(int j=mono[0][i];j<=bagCap;j++){ dp[i][j]=Math.max(dp[i+1][j],dp[i+1][j-mono[0][i]]+mono[1][i]); } } //打表到最顶层时的处理 if(bagCap<mono[0][0]){ dp[0][bagCap]=dp[1][bagCap]; }else{ dp[0][bagCap]=Math.max(dp[1][bagCap],dp[1][bagCap-mono[0][0]]+mono[1][0]); } System.out.println("最优解是:"+dp[0][bagCap]); } }
测试:
动态规划算法实现部分——0/1背包问题
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。