原题链接:采药
import java.io.*; public class Main { static BufferedReader bf=new BufferedReader(new InputStreamReader(System.in)); static PrintWriter pw=new PrintWriter(new BufferedWriter(new OutputStreamWriter(System.out))); public static void main(String[] args) throws IOException,NullPointerException { //获取T和M String[] temp=bf.readLine().split(" "); int T=Integer.parseInt(temp[0]); int M=Integer.parseInt(temp[1]); //开创时间容量数组,和价值数组 int[] timeArr=new int[M+1]; int[] valueArr=new int[M+1]; //存入数据 for(int i=1;i<=M;i++) { temp=bf.readLine().split(" "); timeArr[i]=Integer.parseInt(temp[0]); valueArr[i]=Integer.parseInt(temp[1]); } //设一个dp数组 int[][] dp=new int[M+1][T+1]; //遍历M件物品 for(int i=1;i<=M;i++) { //遍历每件物品的体积,取得各个体积的最大价值 for(int j=T;j>=0;j--) { if(j>=timeArr[i]) { dp[i][j]=Math.max(dp[i-1][j], dp[i-1][j-timeArr[i]]+valueArr[i]); }else { dp[i][j]=dp[i-1][j]; } } } //输出当时间取T时,且遍历完M件物品时的价值 pw.print(dp[M][T]); pw.flush(); } }
解题思路:
水平不够,没有再去理解一维动态规划的解法,但是也差不多了,没啥区别的,这里省事方便理解就用二维了
非常经典的背包问题,首先用快读快写存入数据,也就是一个模板,背下来非常方便,然后遍历遍历M件物品,i为何止,代表着,当前可以选前i件物品,在循环体积,j为何值,dp[i][j]的意思即为,在前i件物品中选,体积为j时的最大价值,如果选了,那么说明前i-1件就只能有j-timeArr[i]的体积,也就是限定体积减去当前需要的体积,如果不选,那就直接取前i-1件,体积不变。如果当前限定的体积大于当前物品体积,那很明显,就不需要选当前这件,只有能选的时候才要判段。
最后,获得前M件物品,设定体积为T,也就是题目要求的最大价值。
注意事项:
物品从1开始记,注意初始化数组的长度
0.0分
1 人评分
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复