其实就是一个普通 01 背包问题。 假设 n 个数里有 m 种数值,将这 m 种数值从小到大排序,并记每种数值的价值为 val[i]=值本身*个数 i:1~m 然后就是 dp 定义。 dp[i][0]:前 i 种数,不选入第 i 种数值,所获得的最大价值 dp[i][1]:前 i 种数,选入第 i 种数值,所获得的最大价值。 dp[i][0] = max(dp[i-1][0], dp[i-1][1]) dp[i][1] = dp[i-1][0]+val[i] 最终结果就是 max(dp[m][0], dp[m][1])