由于水平原因,博客大部分内容摘抄于网络,如有错误或者侵权请指出,本人将尽快修改

0 1背包问题之leetcode总结

直接上代码吧,可以递归解决也可以非递归解决。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
import java.util.LinkedList;
 
public class Main{
    /*
      由dp[i - 1][j]推出,即背包容量为j,里面不放物品i的最大价值,此时dp[i][j]就是dp[i - 1][j]
      由dp[i - 1][j - weight[i]]推出,dp[i - 1][j - weight[i]] 为背包容量为j - weight[i]的时候不放物品i的最大价值,
      那么dp[i - 1][j - weight[i]] + value[i] (物品i的价值),就是背包放物品i得到的最大价值
     */
    static void test_2_wei_bag_problem1() {
        int[] weight = {1, 3, 4};
        int[] value = {15, 20, 30};
        int bagWeight = 4;//包的容量
 
        bagWeight = 6;//包的容量
        weight=new int[]{1,2,3,4,5};
        value=new  int[]{2,4,4,5,6};
 
        bagWeight = 100;//包的容量
        weight=new int[]{77,22,29,50,99};
        value=new  int[]{92,22,87,46,90};
 
 
        // 二维数组
        int[][] dp = new int[weight.length][bagWeight + 1];
        // 初始化
        //初始化第一列 weight[0]
        for (int i = 1; i < dp[0].length; i++) {
            if (i >= weight[0]) {
                dp[0][i] = value[0];
            }
        }
        //容量为0
        for (int i = 0; i < dp.length; i++) {
            dp[i][0] = 0;
        }
        // weight数组的大小 就是物品个数
        for (int i = 1; i < weight.length; i++) { // 遍历物品
            for (int j = 1; j <= bagWeight; j++) { // 遍历背包容量
                if (j < weight[i]) dp[i][j] = dp[i - 1][j];
                else dp[i][j] = Math.max(dp[i - 1][j], dp[i - 1][j - weight[i]] + value[i]);
 
            }
        }
        System.out.println(dp[weight.length - 1][bagWeight]);
    }
 
    public static void test_2_wei_bag_problem0() {
        int[] weight = {1, 3, 4};
        int[] value = {15, 20, 30};
        int bagWeight = 6;//包的容量
 
        bagWeight = 6;
        weight=new int[]{1,2,3,4,5};
        value=new  int[]{2,4,4,5,6};
 
        bagWeight = 100;//包的容量
        weight=new int[]{77,22,29,50,99};
        value=new  int[]{92,22,87,46,90};
        helper(weight,value,bagWeight,0);
        System.out.println(sum);
    }
 
    public static LinkedList<Integer> list = new LinkedList<>();
    public static int sum = 0;
 
    public static void helper(int[] weight, int[] value, int bagWeight, int index) {
        if (index >= weight.length)
            return;
        if (bagWeight >= 0) {
            int cnt = 0;
            for (Integer i :
                    list) {
                cnt+=i;
            }
            sum=Math.max(sum,cnt);
        }
 
        list.add(value[index]);
        helper(weight, value, bagWeight - weight[index], index + 1);
        list.pollLast();
        helper(weight, value, bagWeight, index + 1);
 
    }
 
    public static void main(String[] args) {
        test_2_wei_bag_problem1();
        test_2_wei_bag_problem0();
    }
}

  

posted @   小纸条  阅读(259)  评论(0编辑  收藏  举报
编辑推荐:
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异
· 三行代码完成国际化适配,妙~啊~
点击右上角即可分享
微信分享提示