这个问题可以用动态规划的方法求解。 首先,我们定义一个二维数组dp,其中dp[i][j]表示前i个大臣中,权力互不相同,并且总代价为j的方案数。 对于每个大臣i,他的权力值为num[i],代价为cost[i]。假设现在处理第i个大臣,我们有两种选择: 1. 不增加第i个大臣的权力值(num[i]不变),此时总代价为j维持不变,即dp[i][j] = dp[i-1][j]。 2. 增加第i个大臣的权力值(num[i]增加),此时总代价为j - cost[i-1](因为代价册子不能再改动,所以不可以使用cost[i]),即dp[i][j] = dp[i-1][j - cost[i-1]]。 综合上述两种情况,我们有递推公式: dp[i][j] = dp[i-1][j] + dp[i-1][j - cost[i-1]] 最终的答案为dp[n][k],其中n为大臣的数量,k为总代价。 为了避免超出长整型的范围,我们需要对每次计算的结果取模,即dp[i][j] = (dp[i-1][j] + dp[i-1][j - cost[i-1]]) % MOD,其中MOD为2^64。 然后,我们可以使用滚动数组优化空间复杂度,只保留当前行和上一行的数据,即只需要两个一维数组dp[2][k+1]。 最终的代码如下: ``` def minimize_power(num, cost): n = len(num) k = sum(cost) MOD = 264 dp = [[0] * (k+1) for _ in range(2)] dp[0][0] = 1 for i in range(1, n+1): for j in range(k+1): dp[i%2][j] = dp[(i-1)%2][j] if j >= cost[i-1]: dp[i%2][j] += dp[(i-1)%2][j - cost[i-1]] dp[i%2][j] %= MOD return dp[n%2][k] ``` 调用该函数即可计算结果。注意,此处的权力值和代价值应当为正整数,并且代价册子中的代价值应当按从小到大的顺序排序。 [2024-11-17 14:37:57 | AI写代码神器 | 924点数解答]