第一题明显的动态规划,但是我只是在头一天看过,虽然后面也绞尽脑汁写出一个带约束的背包问题,但是那也是在参考别人代码的情况下写出来的。明白题目的意思就花了我过半的时间
第二天突然就明白自己错在哪里了。
n个产品m个零件加工问题Aij为第i个产品第j个零件加工所需要的时间,想要加工Aij必须先加工Ai-1,j和Ai,j-1
当时疑惑这个21.999999怎么来的,题目里隐藏的信息是零件可以同时加工,只要它的前置条件满足就行,然后就是这条数据了真的看了很久才明白。比如说,我们要生产第二个产品。需要生产第一个产品,这里的第一个产品第二个零件和第二个产品第一个零件可以同时加工,因此总的花费时间就为10 + 5 + 3
输入
2 4
10.00000 5.000000
4.500000 3.000000
4.499999 2.000000
2.000000 1.000000
输出
21.999999
首先存数据,因为题目说第i个嘛,所有我都把下标加1了
Scanner scanner = new Scanner(System.in); int m= scanner.nextInt(); // 零件 int n = scanner.nextInt(); //产品 float[][] A = new float[n+1][m+1]; float count = 0; for (int i = 0; i < n; i++){ for (int j = 0; j < m; j++){ A[i+1][j+1] = scanner.nextFloat(); } }
其实题目的意思,我们也可以知道状态转移方程
time[i][j] = Math.max(time[i-1][j], time[i][j-1])+A[i][j]
因为我没学过算法,所以在这里被题目给迷惑了,我当时写的是
time[i][j] = Math.min(time[i][j-1]+time[i-1][j] + A[i][j], time[i][j])
加上初始条件
public static float def(float[][] s){ //5 3 s[0][0] = 0; s[0][1] = 0; s[1][0] = 0; float[][] time = new float[s.length][s[0].length]; for (int i = 1; i < s.length; i++) { for (int j = 1; j < s[0].length; j++) { time[i][j] = Math.max(time[i][j - 1],time[i - 1][j])+s[i][j]; } } return time[s.length-1][s[0].length-1]; }
原文:https://www.cnblogs.com/c-xjj/p/12771583.html