每日一题——开心的金明(01背包问题)

本文介绍了一道动态规划的算法题目,金明需要在有限预算内购买物品,目标是最大化物品价格与重要度的乘积之和。AC代码展示了一个使用动态规划求解的Java实现,通过二维数组记录子问题的最优解,最终得出在不超过预算的情况下能获得的最大乘积总和。
摘要由CSDN通过智能技术生成

大家好呀,我是爬行系,一枚正在算法路上爬行的菜鸟!五一假期快乐呢,坚持打卡,训练动规。


动态规划

  • 动态规划是一种递推算法,用局部最优解来推导全局最优解,是对遍历解空间的一种优化。它代表了具有最优子结构or子问题最优解的一类问题的一般解法,是设计方法或策略。
  • 最优子结构:是当下就可以用某种策略确定选择,无需考虑未来(未来的演变也影响不了当下的选择)是无后效性的。
  • 本质是递推,核心是找到状态转移方程,写出dp方程。

题目描述

金明今天很开心,家里购置的新房就要领钥匙了,新房里有一间他自己专用的很宽敞的房间。更让他高兴的是,妈妈昨天对他说:“你的房间需要购买哪些物品,怎么布置,你说了算,只要不超过N元钱就行”。今天一早金明就开始做预算,但是他想买的东西太多了,肯定会超过妈妈限定的N元。于是,他把每件物品规定了一个重要度,分为5等:用整数1-5表示,第5等最重要。他还从因特网上查到了每件物品的价格(都是整数元)。他希望在不超过N元(可以等于N元)的前提下,使每件物品的价格与重要度的乘积的总和最大。
题目链接

AC代码

import java.util.Scanner;
public class Main{
	
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Scanner sc=new Scanner(System.in);
		int n=sc.nextInt();
		int m=sc.nextInt();
		int[] w=new int[m+1];
		int[] v=new int[m+1];
		int[][] sum=new int[m+1][n+1];//行代表还剩下m个物体可选,列代表剩余的钱
		for(int i=1;i<=m;i++) {
			v[i]=sc.nextInt();
			w[i]=sc.nextInt();
		}
		for(int i=1;i<=m;i++) {
			for(int j=0;j<=n;j++) {
				if(j>=v[i]) {//可选,在选与不选中取乘积最大的
					sum[i][j]=Math.max(sum[i-1][j],sum[i-1][j-v[i]]+w[i]*v[i]);
				}else {//不可选
					sum[i][j]=sum[i-1][j];
				}
			}
		}
		System.out.println(sum[m][n]);
	}

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

爬行系

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值