动态规划——装箱问题

在这里插入图片描述
使用动态规划,dp[i]记录当容积为i时的最大填充体积

import java.util.Arrays;
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner sc=new Scanner(System.in);
        int capacity=sc.nextInt(),n=sc.nextInt();
        //输入物体的体积
        int[]objs=new int[n];
        for(int i=0;i<n;i++)
            objs[i]=sc.nextInt();
        //初始化dp数组
        int[]dp=new int[capacity+1];
        Arrays.fill(dp,0);
        //work
        for(int i=0;i<n;i++){
            for(int j=capacity;j>=objs[i];j--){
                dp[j]=Math.max(dp[j],dp[j-objs[i]]+objs[i]);
            }
        }
        System.out.println(capacity-dp[capacity]);
    }
}


当输入为10 3 4 5 8时dp数组的变化(即箱子容积为10,有三个物体,体积分别为4,5,8)

dp[0]dp[1]dp[2]dp[3]dp[4]dp[5]dp[6]dp[7]dp[8]dp[9]dp[10]
00000000000
00004444444
00004555599
00004555899

两层循环:

  1. 外层表示本轮使用第i个物体
  2. 内层表示用该物体填充各种最大容积情况下的容器
  3. dp[j]=Math.max(dp[j],dp[j-objs[i]]+objs[i]); 表示从以前的最大填充体积,和放入该物体后的最大填充体积中选取大的那个。
  4. dp[j-objs[i]]+objs[i]表示:除去该物体的体积后,剩下的容积在以前的情形下的最大填充体积 + 该物体的体积

每一轮循环(从dp[10]到dp[objs[i]] )放入物体,务必从右往左,因为从右往左参考的小的dp值是上一轮的,即参考的是以前放入物品后形成的最大填充体积,而从左往右会导致参考的dp值有可能已受本轮物品的影响,则造成二次放入,for(int j=capacity;j>=objs[i];j--)必须这样写

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值