动态规划之背包问题01——Java实现

public class BackPack {
    public static void main(String[] args) {
        int m = 10;
        int n = 3;
        int w[] = {3, 4, 5};
        int p[] = {4, 5, 6};
        int c[][] = BackPack_Solution(m, n, w, p);
        for (int i = 1; i <=n; i++) {
            for (int j = 1; j <=m; j++) {
                System.out.print(c[i][j]+"\t");
                if(j==m){
                    System.out.println();
                }
            }
        }
        //printPack(c, w, m, n);

    }

 /**
     * @param m 表示背包的最大容量
     * @param n 表示商品个数
     * @param w 表示商品重量数组
     * @param p 表示商品价值数组
     */
    public static int[][] BackPack_Solution(int m, int n, int[] w, int[] p) {
        //c[i][v]表示前i件物品恰放入一个重量为m的背包可以获得的最大价值
        int c[][] = new int[n + 1][m + 1];
        for (int i = 0; i < n + 1; i++)
            c[i][0] = 0;
        for (int j = 0; j < m + 1; j++)
            c[0][j] = 0;

        for (int i = 1; i < n + 1; i++) {
            for (int j = 1; j < m + 1; j++) {
                //当物品为i件重量为j时,如果第i件的重量(w[i-1])小于重量j时,c[i][j]为下列两种情况之一:
                //(1)物品i不放入背包中,所以c[i][j]为c[i-1][j]的值
                //(2)物品i放入背包中,则背包剩余重量为j-w[i-1],所以c[i][j]为c[i-1][j-w[i-1]]的值加上当前物品i的价值
                if (w[i - 1] <= j) {
                    if (c[i - 1][j] < (c[i - 1][j - w[i - 1]] + p[i - 1]))
                        c[i][j] = c[i - 1][j - w[i - 1]] + p[i - 1];
                    else
                        c[i][j] = c[i - 1][j];
                } else
                    c[i][j] = c[i - 1][j];
            }
        }
        return c;
    }

对于背包问题的贪心算法,可以按照物品的单位重量价值进行排序,然后依次选择单位重量价值最高的物品放入背包中,直到背包装满或者没有可选的物品为止。这个算法可以通过以下Java代码实现: ```java public class KnapsackGreedy { public static int maxValue(int[] values, int[] weights, int max){ if(values == null || values.length == 0){ return 0; } if(weights == null || weights.length == 0){ return 0; } if(max <= 0){ return 0; } int n = values.length; double[] valuePerWeight = new double[n]; for(int i=0; i<n; i++){ valuePerWeight[i] = (double) values[i] / weights[i]; } int[] sortedIndex = new int[n]; for(int i=0; i<n; i++){ sortedIndex[i] = i; } Arrays.sort(sortedIndex, (a, b) -> Double.compare(valuePerWeight[b], valuePerWeight[a])); int maxValue = 0; int currentWeight = 0; for(int i=0; i<n; i++){ int index = sortedIndex[i]; if(currentWeight + weights[index] <= max){ maxValue += values[index]; currentWeight += weights[index]; } } return maxValue; } public static void main(String[] args) { int[] values={6,3,5,4,6}; int[] weights={2,2,6,5,4}; int max = 10; System.out.println(maxValue(values,weights,max)); } } ``` 以上是一个简单的贪心算法实现,它通过计算每个物品的单位重量价值,并按照降序对物品进行排序。然后依次选择单位重量价值最高的物品放入背包中,直到背包装满或者没有可选的物品为止。该算法的时间复杂度为O(nlogn),其中n为物品的数量。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [背包问题Java实现)——贪心算法](https://blog.csdn.net/qq_40956679/article/details/83684383)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *2* *3* [java语言贪心算法之背包问题](https://blog.csdn.net/ityw520/article/details/121514232)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值