You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

76 lines
2.6 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

package 03.mca_10;
import java.util.Arrays;
// 来自小红书
// 实验室需要配制一种溶液现在研究员面前有n种该物质的溶液
// 每一种有无限多瓶第i种的溶液体积为v[i]里面含有w[i]单位的该物质
// 研究员每次可以选择一瓶溶液,
// 将其倒入另外一瓶(假设瓶子的容量无限),即可以看作将两个瓶子内的溶液合并
// 此时合并的溶液体积和物质含量都等于之前两个瓶子内的之和。
// 特别地如果瓶子A与B的溶液体积相同那么A与B合并之后
// 该物质的含量会产生化学反应使得该物质含量增加x单位
// 研究员的任务是配制溶液体积恰好等于c的且尽量浓的溶液(即物质含量尽量多)
// 研究员想要知道物质含量最多是多少
// 对于所有数据1 <= n, v[i], w[i], x, c <= 1000
public class Code04_ChemicalProblem {
public static int maxValue(int[] v, int[] w, int x, int c) {
int n = v.length;
// dp[0] ? dp[1] ? dp[2] ? dp[c] ?
int[] dp = new int[c + 1];
// dp[i] = -1, 得到i体积目前为止无方案
Arrays.fill(dp, -1);
// 天然有的规格,先填一下
for (int i = 0; i < n; i++) {
// 3 10 dp[3] = 10
// 5 13 dp[5] = 13
// 3 20 dp[3] = 20
if (v[i] <= c) {
dp[v[i]] = Math.max(dp[v[i]], w[i]);
}
}
// 1 ? 2 ? 3 ? c ? dp[1....c]
for (int i = 1; i <= c; i++) {
// i = 10体积
// 1 + 9
// 2 + 8
// 3 + 7
// 4 + 6
// 5 + 5 + x
for (int j = 1; j <= i / 2; j++) {
// dp[10] = dp[1] + dp[9]
// 能得到 能得到
if (dp[j] != -1 && dp[i - j] != -1) {
dp[i] = Math.max(dp[i],
dp[j] + dp[i - j] + (j == i - j ? x : 0));
}
}
}
return dp[c];
}
public static void main(String[] args) {
// 调配溶液
// 规格0 (体积5含量2)
// 规格1 (体积3含量4)
// 规格2 (体积4含量1)
// 合并双方体积不等的情况下 :
// (体积5含量2) + (体积4含量1) = (体积9含量3)
// 合并双方体积相等的情况下 :
// (体积5含量5) + (体积5含量2) = (体积10含量5 + 2 + x)
// x额外增加固定int类参数x= 10
// c一定要得到c体积的溶液含量最大能是多少 ?
int[] v = { 5, 3, 4 };
int[] w = { 2, 4, 1 };
int x = 4;
int c = 16;
// (体积3含量4) + (体积3含量4) = (体积6含量12)
// (体积3含量4) + (体积3含量4) = (体积6含量12)
// (体积6含量12) + (体积6含量12) = (体积12含量28)
// (体积12含量28) + (体积4含量1) = (体积16含量29)
System.out.println(maxValue(v, w, x, c));
}
}