您的位置:首页 > 其它

01背包问题

2018-03-22 11:47 232 查看
关于01背包问题,有很多种解法。本题用到的是动态规划求解。判断一个问题是否可以用动态规划求解,首先必须分析问题解的结构,考察它的最优解是否具有最有子结构的特性,其次应当检查分解所得的子问题是否相互独立,是否存在重叠子问题的现象背包问题的求解主要是判断是否将第i件物品放入背包:这就分成两种情况1)放入背包 2)不放 。然后继续判断第i-1件物品其递推公式主要是f(i,V) = max{f(i-1,V), f(i-1,V-w[i] ) + d[i]}import java.util.Scanner;/**** @author yanzz* @编辑时间:2018年3月22日* @功能说明:0-1背包的问题** N件物品和容积为M的背包 第i件物品的体积w[i],价值d[i] 求解将那些物品装入背包可是价值总和最大。每种物品只有一件,* 可以选择放或者不放 N<=3500,M<=1300* Test数据:* 3 6* 2 3 4* 1 2 4* @version:*/public class Bag {/*** F[i][j]表示取前i种物品,背包容积j** F[i][j] = max{F[i-1][j],F[i-1][j-w[i]]+d[i]}*/private static int n, m;private static int[] w;private static int[] d;private static int[][] F; // 保存(i,j)时的状态private static int max;/*** 简单递归实现时间复杂度O(n^2)*/public static int f(int i, int j) {if (i < 0) {return (j < 0)? -0x3f3f3f3f:0;}if(w[i] > j) {//如果第i件的体积大于背包容积return f(i - 1, j);} else {int a = f(i - 1, j); // 不取第i件int b = f(i - 1, j - w[i]) + d[i]; // 取第i件max = Math.max(a, b);}return max;}public static void main(String[] args) {Scanner sc = new Scanner(System.in);n = sc.nextInt();m = sc.nextInt();w = new int;d = new int;F = new int[m];int i, j;for (i = 0; i < n; i++) {w[i] = sc.nextInt(); // 体积}for (i = 0; i < n; i++) {d[i] = sc.nextInt(); // 价值}System.out.println("最优解:" + f(n-1, m));sc.close();}}
关于这道题,采用的解法是递归解法时间复杂度为O(n^2),还有更好的解法可以使用滚动数组保存值减少计算,时间复杂度O(n^m).
                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  dp