大家好呀,我是爬行系,一枚正在算法路上爬行的菜鸟!五一假期快乐呢,坚持打卡,训练动规。
动态规划
- 动态规划是一种递推算法,用局部最优解来推导全局最优解,是对遍历解空间的一种优化。它代表了具有最优子结构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]);
}
}