动态规划案例——01背包问题

这是一个使用Java编写的动态规划算法,解决01背包问题的实例。代码通过二维数组c存储状态,计算每个物品装入不同容量背包的最大价值。最后通过回溯找到包含在最优解中的物品列表。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

package bluebrige;

import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

public class Package {
    static int C=12;
    static int [][]c=new int[7][13];
    static int []v= {8,10,6,3,7,2};
    static int []w= {4,6,2,2,5,1};
    public static void main(String[] args) {
        Scanner sc=new Scanner(System.in);
        for(int i=0;i<c[0].length;i++) {
            c[0][i]=0;
        }
        for(int j=1;j<c.length;j++) {
            c[j][0]=0;
        }
        maxValue();
        for(int i=0;i<c.length;i++) {
            for(int j=0;j<c[0].length;j++) {
                System.out.print(c[i][j]+" ");
            }
            System.out.println();
        }
        //回溯得到背包中装的物品
        List list=new ArrayList();
        for(int i=c.length-1;i>0;i--) {
            if(c[i][C]==c[i-1][C]) {
                continue;//装不装第i个物品价值都一样,说明最优化方案中不包括i
            }
            else {
                list.add(i);
                C-=w[i-1];//背包容量减去当前装入的物品重量
            }
        }
        System.out.println(list);
    }
public static void maxValue() {
    for(int i=1;i<c.length;i++) {
        for(int j=1;j<c[0].length;j++) {
            if(j<w[i-1]) {
                c[i][j]=c[i-1][j];//如果当前背包容量小于物品重量,则无法装入,装入i的价值与不装入i的价值是一样的
            }
            else {
                c[i][j]=Integer.max(c[i-1][j], c[i-1][j-w[i-1]]+v[i-1]);//当前背包容量可以装下i,比较装之前和装之后的最优值,若装之后的最优值大,则装入
            }
        }
    }
}
}
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值