【动态规划】0-1背包问题

博客围绕动态规划解决0-1背包问题展开,包含题目描述、示例展示,阐述了解题思路并给出代码,借助动态规划算法有效处理该经典问题。

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

【动态规划】0-1背包问题

题目描述

设有n种物品(每种物品1件)和一个容量为value的背包。第i件物品占用的容量为w[i],得到的价值是v[i]。要求求出哪些物品可以放入背包,使得背包价值总和最大。

示例

输入描述:
	物品数量n
	背包容量value
	物品占用容量
	物品价值
输出描述:
	最大价值总和
	
输入:
	4
	8
	2 3 4 5
	3 4 5 6
输出:
	10

解题思路

设dp[i][j]表示前i种物品放入一个容量为j的背包可以获得的最大价值。一共有两种策略:
	1、当前第i个物品放进背包(要求w[i]小于等于当前容量j)
	2、第i个物品不放进背包
由此得出的状态转移方程为:
	**dp[i][j] = max{dp[i-1][j], dp[i-1][j-w[i]]+v[i]}**

代码

public class backpack {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        int value = sc.nextInt();
        int []w = new int[n + 1];
        int []v = new int[n + 1];
        for(int i=1;i<=n;++i){
            w[i] = sc.nextInt();
        }
        for(int i=1;i<=n;++i){
            v[i] = sc.nextInt();
        }
        int [][]dp = new int[n+1][value+1];
        for(int i = 0;i <= n;++i){
            dp[i][0] = 0;
        }
        for(int i = 0;i <= value;++i){
            dp[0][i] = 0;
        }
        for(int i = 1;i <= n;++i){
            for(int j = 1;j <= value;++j){
                if(j - w[i] >= 0)
                    dp[i][j] = Math.max(dp[i-1][j],dp[i-1][j-w[i]]+v[i]);
                else
                    dp[i][j] = dp[i-1][j];
            }
        }
        System.out.println(dp[n][value]);
    }
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值