1. 程式人生 > >動態規劃例題

動態規劃例題

pan 根據 png 例題 分享圖片 char 簡便 bject sign

搬寢室

題目描述

搬寢室是很累的,xhd深有體會.時間追述2006年7月9號,那天xhd迫於無奈要從27號樓搬到3號樓,因為10號要封樓了.看著寢室裏的n件物品,xhd開始發呆,因為n是一個小於2000的整數,實在是太多了,於是xhd決定隨便搬2*k件過去就行了.但還是會很累,因為2*k也不小是一個不大於n的整數.幸運的是xhd根據多年的搬東西的經驗發現每搬一次的疲勞度是和左右手的物品的重量差的平方成正比(這裏補充一句,xhd每次搬兩件東西,左手一件右手一件).例如xhd左手拿重量為3的物品,右手拿重量為6的物品,則他搬完這次的疲勞度為(6-3)^2 = 9.現在可憐的xhd希望知道搬完這2*k件物品後的最佳狀態是怎樣的(也就是最低的疲勞度),請告訴他吧.

輸入描述:

每組輸入數據有兩行,第一行有兩個數n,k(2<=2*k<=n<2000).第二行有n個整數分別表示n件物品的重量(重量是一個小於2^15的正整數).

輸出描述:

對應每組輸入數據,輸出數據只有一個表示他的最少的疲勞度,每個一行.
示例1

輸入

2 1
1 3

輸出

4

解題思路:這道題可以先依據物品的重量對物品進行排序,
然後從低到高每次選擇相鄰兩個組成一對
 1 #include<stdio.h>
 2 #include<stdlib.h>
 3 #include<string.h>
 4 #include<limits.h>
 5
6 int cmp( const void *a,const void *b) 7 { 8 return *( int *)a- *(int *)b; //遞增排序 9 } 10 int goods[2002]; //保存每個物品的重量 11 int dp[1001][2001]; //在前j件物品中選擇i對物品時的最小疲勞度 12 int main() 13 { 14 int n,k; 15 int i,j; 16 while( scanf("%d%d",&n,&k)!=EOF) 17 { 18 for( i=1; i<=n; i++)
19 scanf("%d",&goods[i]); 20 qsort( goods+1, n,sizeof(goods[0]),cmp); 21 for( i=1; i<=n; i++) 22 dp[0][i] = 0; //不選擇任何一對物品時,疲勞度為0 23 for( i=1; i<=k; i++) 24 { 25 for( j=2*i; j<=n; j++) 26 { 27 if( j>2*i) 28 dp[i][j] = dp[i][j-1]; //若j>2*i則表明最後兩個物品可以不配對 29 else dp[i][j] = INT_MAX; 30 if( dp[i][j] > dp[i-1][j-2]+(goods[j]-goods[j-1])*(goods[j]-goods[j-1])) 31 //即前 j-2件物品配成i-1對再加上最後兩件配成的一對物品,共得到i對物品 32 dp[i][j] = dp[i-1][j-2]+(goods[j]-goods[j-1])*(goods[j]-goods[j-1]); 33 } 34 } 35 printf("%d\n",dp[k][n]); 36 } 37 38 return 0; 39 }

在這裏我還加入了 <limits.h> 用於簡便最大值的選取



 1 #include <stdio.h>
 2 #include <limits.h>
 3 
 4 int main()
 5 {
 6 
 7    printf("The number of bits in a byte %d\n", CHAR_BIT);
 8 
 9    printf("The minimum value of SIGNED CHAR = %d\n", SCHAR_MIN);
10    printf("The maximum value of SIGNED CHAR = %d\n", SCHAR_MAX);
11    printf("The maximum value of UNSIGNED CHAR = %d\n", UCHAR_MAX);
12 
13    printf("The minimum value of SHORT INT = %d\n", SHRT_MIN);
14    printf("The maximum value of SHORT INT = %d\n", SHRT_MAX); 
15 
16    printf("The minimum value of INT = %d\n", INT_MIN);
17    printf("The maximum value of INT = %d\n", INT_MAX);
18 
19    printf("The minimum value of CHAR = %d\n", CHAR_MIN);
20    printf("The maximum value of CHAR = %d\n", CHAR_MAX);
21 
22    printf("The minimum value of LONG = %ld\n", LONG_MIN);
23    printf("The maximum value of LONG = %ld\n", LONG_MAX);
24   
25    return 0;
26 }

技術分享圖片






動態規劃例題