搬寝室(动态规划)

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#define MAX 0x3f3f3f3f
using namespace std;
int dp[2500][1500],Goods[2500];
int main()
{
int N,M;
while(~scanf("%d%d",&N,&M))
{
memset(Goods,0,sizeof(Goods));//每组数据重新置为零
for(int i=0; i<=N; i++)
for(int j=1; j<=M; j++)
dp[i][j]=MAX;//因为是求最小的疲劳度,有些数据用不到,所以将所有的数据先设为最大值
dp[0][0]=0;
for(int i=1; i<=N; i++)
scanf("%d",&Goods[i]);
sort(Goods,Goods+N+1);//按货物的重量排序,这样相邻的差值最小,
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]+(Goods[i]-Goods[i-1])*(Goods[i]-Goods[i-1]));/*每次增加一个物品时,这个物品都有两种状态,取或不取,如果不去,则和在(i-1)个物品中选取j对是一样的,如果第i个物品去了,那么第(i-1)个物品一定要取,因为他们是相邻的,因为相邻的差值最小嘛,此时相当于在(i-2)个物品中取(j-1)对再加上最后一对;*/
printf("%d\n",dp[N][M]);

}

return 0;
}

posted @ 2015-11-16 17:07  -梦里不知身是客  阅读(157)  评论(0编辑  收藏  举报