时间:2021-05-19
【题目描述】
一个旅行者有一个最多能装 MM 公斤的背包,现在有 nn 件物品,它们的重量分别是W1,W2,…,WnW1,W2,…,Wn,它们的价值分别为C1,C2,…,CnC1,C2,…,Cn,求旅行者能获得最大总价值。
【输入】
第一行:两个整数,MM(背包容量,M<=200M<=200)和NN(物品数量,N<=30N<=30);
第2…N+12…N+1行:每行二个整数Wi,CiWi,Ci,表示每个物品的重量和价值。
【输出】
仅一行,一个数,表示最大总价值。
【输入样例】
10 4
2 1
3 3
4 5
7 9
【输出样例】
12
我们可以通过自己打表的方式找变化求得状态方程
(横向表示容量,j)(纵向表示第几个,i)
#1 2 3 4 5 6 7 8 9 10
1 0 1 1 1 1 1 1 1 1 1
2 0 1 3 3 4 4 4 4 4 4
3 0 1 3 5 5 6 8 8 9 9
4 0 1 3 5 5 6 9 9 10 12
dp[i][j]----i表示物品个数,j表示容量,dp[i][j]的值表示在此状态的最大价值
由此我们可以写出状态转移方程:
完整代码如下:
import java.util.*;public class Main { public static void main(String[] args) { Scanner in = new Scanner(System.in); int m, n; int[] w = new int[35]; int[] v = new int[35]; m = in.nextInt(); n = in.nextInt(); int[][] dp = new int[35][205];//m容量,n数目个数 for (int i = 1; i <= n; i++) { w[i] = in.nextInt(); v[i] = in.nextInt(); } for (int i = 1; i <= n; i++) { for (int j = 1; j <= m; j++) { if(j<w[i]) { dp[i][j]=dp[i-1][j]; }else { dp[i][j]=Math.max(dp[i-1][j],dp[i-1][j-w[i]]+v[i]); } } } //输出dp数组 for (int i = 1; i <= n; i++) { for (int j = 1; j <= m; j++) { System.out.print(dp[i][j]+" "); } System.out.println(); } System.out.println(dp[n][m]); in.close(); }}当然,如果容量数字和物品个数很大的时候,这个表会很大,但是dp数组只与自己的上一次有关,会造成空间浪费,所以我们可以改进成滚动数组,减小空间,使其变成一维数组。
小tips:因为是滚动数组,所以如果第二层循环从1开始的话,可能会覆盖上一次的值,所以第二层循环的时候我们从后往前开始!
import java.util.*;import java.lang.*;public class Main { static int[]dp=new int[205]; static int[] w = new int[35]; static int[] v = new int[35]; public static void main(String[] args) { Scanner in = new Scanner(System.in); int m, n; m = in.nextInt(); n = in.nextInt();// int[][] dp = new int[35][205];//m容量,n数目个数 for (int i = 1; i <= n; i++) { w[i] = in.nextInt(); v[i] = in.nextInt(); } for (int i = 1; i <= n; i++) { for (int j = m; j >= 1; j--) { if(j>=w[i]) { dp[j]=Math.max(dp[j],dp[j-w[i]]+v[i]); } } } //输出dp数组// for (int i = 1; i <= n; i++) {// for (int j = 1; j <= m; j++) {// System.out.print(dp[i][j]+" ");// }// System.out.println();// }// System.out.println(dp[n][m]); System.out.println(dp[m]); in.close(); }}以上就是java动态规划算法之背包问题的详细内容,更多关于java动态规划背包的资料请关注其它相关文章!
声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。
本文实例讲述了Python基于动态规划算法解决01背包问题。分享给大家供大家参考,具体如下:在01背包问题中,在选择是否要把一个物品加到背包中,必须把该物品加进
本文实例讲述了java动态规划算法——硬币找零问题。分享给大家供大家参考,具体如下:问题描述现在有3种硬币分别为:1元,5元,10元,现在给你63元,让你全部换
本文实例讲述了PHP贪婪算法解决0-1背包问题的方法。分享给大家供大家参考。具体分析如下:贪心算法解决0-1背包问题,全局最优解通过局部最优解来获得!比动态规划
利用动态规划算法,实现最短编辑距离的计算。复制代码代码如下:#encoding:utf-8#author:xujin#date:Nov12,2012#EditD
本文实例讲述了Python基于动态规划算法计算单词距离。分享给大家供大家参考。具体如下:#!/usr/bin/envpython#coding=utf-8def