此题是动态规划题。
解题思路:
用w[i]存储n个物品的重量,对其进行排序。
那么当取了第i个物品,必然会取第i-1个物品。
令dp[i][j]表示前i个物品,取j对的最小疲劳度。
若取第i个物品
则:dp[i][j]=dp[i-2][j-1]+(w[i]-w[i-1])*(w[i]-w[i-1]);
若不取第i个物品
则:dp[i][j]=dp[i-1][j];
所以状态转移方程为:dp[i][j]=min(dp[i-2][j-1]+(w[i]-w[i-1])*(w[i]-w[i-1]),dp[i-1][j]);
代码:
#include "stdio.h" #include "math.h" #include "queue" #include "stdlib.h" #include "string.h" #include "algorithm" #include "iostream" #define N 100010 #define inf 2147483646 #define eps 1e-8 #define pi acos(-1.0) using namespace std; int dp[2005][1005]; int main() { int n,k,i,j; int w[2005]; while(cin>>n>>k) { w[0]=0; for(i=1;i<=n;i++) cin>>w[i]; sort(w,w+n+1); for(i=0;i<=n;i++) for(j=1;j<=k;j++) dp[i][j]=inf; dp[0][0]=0; for(i=2;i<=n;i++) { for(j=1;j*2<=i;j++) { dp[i][j]=min(dp[i-2][j-1]+(w[i]-w[i-1])*(w[i]-w[i-1]),dp[i-1][j]); } } cout<<dp[n][k]<<endl; } return 0; }
时间: 2024-10-03 23:52:21