码迷,mamicode.com
首页 > 其他好文 > 详细

搬寝室(动态规划)

时间:2015-11-16 19:30:25      阅读:194      评论:0      收藏:0      [点我收藏+]

标签:

#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;
}

搬寝室(动态规划)

标签:

原文地址:http://www.cnblogs.com/aaaadengchaochao/p/4969447.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!