解题思路:dp[i][j]表示前i个物品中取k对所要的最小花费;
首先得对物品进行处理,因为需要当前物品减前一个物品的平方和最小;
所以先排序,因为排序的相邻两个的差的平方一定最小;
然后转移方程:dp[i][j]=min(dp[i-1][j],dp[i-2][j-1]+w);
#include<iostream> #include<algorithm> #include<math.h> #define maxn 2005 #define inf 2147483646 using namespace std; int dp[maxn][1005];int n,k; //dp[i][j]表示前n个物品取k对的值; int w[maxn]; int main() {dp[0][0]=0; w[0]=0; while(cin>>n>>k) { for(int i=1;i<=n;i++) cin>>w[i]; sort(w+1,w+1+n); for(int i=0;i<=n;i++) for(int j=1;j<=k;j++) dp[i][j]=inf; for(int i=2;i<=n;i++) { for(int j=1;2*j<=i;j++) { dp[i][j]=min(dp[i-1][j],dp[i-2][j-1]+(w[i]-w[i-1])*(w[i]-w[i-1])); } } cout<<dp[n][k]<<endl; } return 0; }