动态规划背包问题

案例:背包容量为12kg,货物种类3种,3种货物重量分别为4,5,7,三种货物价值价值分别是500元,600元,800元,求能容纳最大价值;

横向代表当前背包容量,纵向代表放入第n个货物,方格表示当前背包容量下放入第n个货物的最大价值。

在这里插入图片描述

放入的情况
放入的情况在容量为11的情况下,放入第一个货物,能放下,最大价值为500,放入第二个货物,能放下,如果放下价值为600,加上剩余空间最大价值11-5=7,而目前容量为7的最大价值是500,500+600>500所以放入,并且最大价值变成1100;放入第三个货物,能放下,如果放下价值为800,加上剩余容量最大价值11-7=4,目前容量为4的最大价值为500,500+800>1100放入;

不放入的情况
容量为9的情况下,放入第3个货物,可以放下,放下后价值为800,加上剩余容量最大价值9-7=2,2的最大价值为0,所以800+0<1100,所以不放入。

在这里插入图片描述

实现

import java.util.Scanner;

public class C1 {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        String s = sc.nextLine();
        String[] split = s.split(",");
        //背包容量
        int N=Integer.parseInt(split[0]);
        //货物种类
        int m=Integer.parseInt(split[1]);
        //货物重量数组
        String[] st = split[2].split(" ");
        //货物价值数组
        String[] sv = split[3].split(" ");
        int[] stArray = new int[m];
        int[] svArray = new int[m];
        for (int i = 0; i < m; i++) {
            stArray[i]=Integer.parseInt(st[i]);
            svArray[i]=Integer.parseInt(sv[i]);
        }
        int[][] dp = new int[m + 1][N+1];
        for (int i = 1; i <= m; i++) {
            for (int j = 1; j <=N; j++) {
            //可以放下
                if (stArray[i-1]<=j){
                	//比较放下的货物价值加上剩余容量最大价值与不放货物的最大价值
                    dp[i][j]=Math.max(svArray[i-1]+dp[i-1][j-stArray[i-1]],dp[i-1][j]);
                }else { //放不下
                    dp[i][j]=dp[i-1][j];
                }
            }
        }
        System.out.println(dp[m][N]);

    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值