动态规划题,首先将所有物品按重量从小到大排序,dp[i][j] 表示前 i 件物品取 j 对的疲劳值。
对于每件物品,可以将该物品和它前面的物品选为一对,则 dp[i][j] = dp[i-2][j-1] + (weight[i]-weight[i-1])^2;
也可以不选该物品,则 dp[i][j] = dp[i-1][j];
即状态转移方程为 dp[i][j] = min(dp[i-1][j], dp[i-2][j-1] + (weight[i]-weight[i-1])^2)
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
const int MAXN = 2005;
int weight[MAXN]; //物品重量
int dp[MAXN][MAXN / 2];
int main()
{
int n, k;
while (cin >> n >> k)
{
for (int i = 1; i <= n; i++)
{
cin >> weight[i];
}
sort(weight + 1, weight + 1 + n);
memset(dp, 0x3f, sizeof(dp));
for (int i = 0; i <= n; i++)
{
dp[i][0] = 0;
}
for (int i = 2; i <= n; i++) //动态规划
{
for (int j = 1; j * 2 <= i; j++)
dp[i][j] = min(dp[i - 1][j], dp[i - 2][j - 1] + (weight[i] - weight[i - 1]) * (weight[i] - weight[i - 1]));
}
cout << dp[n][k] << endl;
}
return 0;
}
继续加油。