動態規劃例子

2021-06-27 21:28:37 字數 1002 閱讀 7669

對於由從1到n (1 <= n <= 39)這n個連續的整數組成的集合來說,我們有時可以將集合分成兩個部分和相同的子集合。

例如,n=3時,可以將集合 分為和。此時稱有一種方式(即與順序無關)。

n=7時,共有四種方式可以將集合 分為兩個部分和相同的子集合:

和  和  

和  和  

輸入:程式從標準輸入讀入資料,只有一組測試用例。如上所述的n。

輸出:方式數。若不存在這樣的拆分,則輸出0。

對於從1到n的連續整集合,劃分為兩個子集合,且保證每個集合的數字和

是相等的。因而,劃分之後每個子集全的數字應該為n*(n+1)/2的一半,即n*(n+1)/4

由於兩個子集中都是整數,所以n*(n+1)必為偶數,則可以設s=n*(n+1),並判斷s%4 .

則,s/=4是劃分之後子集合的數字和;dyn[i]陣列表示任意個數加起來等於i的組數*/

num[0][0] 保持中間值

1  多階段最優子結構

2 重複計算子問題

狀態轉移方程 

i>j

num[i][j] = num[i-1][j] + num[i-1][j-i];          

else                     num[i][j] = num[i-1][j]; 

**實現:

#includevoid main();  

num[0][0] = 1;

scanf("%d",&input);

x = input, y = (1 + input)*input/2;

sum = y/2;

flag = y%2;

if(flag == 1)

printf("0\n");

else

outresult = num[x][sum];

printf("%d\n",outresult);

} }

動態規劃例子

演算法描述 已知多段圖的鄰接表,利用從後往前遞推的方法,先從最後一層往前保留當前的最短路徑長度,由子結構的最優解得到原問題的最優解。遞推公式是 cost i,j min 這裡為了節約空間,用一維陣列cost來儲存節點j到t的最短路徑長度。將所有節點按0 n 1進行編號,源點s為0,匯點t為n 1 向...

動態規劃經典例子

金明今天很開心,家裡購置的新房就要領鑰匙了,新房裡有一間他自己專用的很寬敞的房間。更讓他高興的是,媽媽昨天對他說 你的房間需要購買哪些物品,怎麼布置,你說了算,只要不超過n元錢就行 今天一早金明就開始做預算,但是他想買的東西太多了,肯定會超過媽媽限定的n元。於是,他把每件物品規定了乙個重要度,分為5...

動態規劃經典例子

求第一層到最後一層的路徑,將該路徑上的所有數字相加後得到的和最大是多少。include using namespace std const int maxn 1000 int f maxn maxn dp maxn maxn int main for int i 1 i n i for int i ...