題目:求正數陣列內和為指定數字的合併總數
比如num = [5, 5, 10, 2, 3],給定的合併值為 15 :
有4種 : {5 + 10, 5 + 10, 5 + 5 + 2 + 3, 10 + 2 + 3}
分析:這實際上是網易有道筆試題之一,我覺得我筆試通過主要就是依靠這個題目,因為其他的做的比較一般。
這道題使用動態規劃思想,大家看如下的狀態轉移方程:
dp[n][m]=dp[n-1][m]+dp[n-1][m-num[n-1]];//這裡的num[n-1]是第n個數字
dp[n][m]表示前n個元素組成和為m的情況數。初始化dp[0][0]=1,其他為0。寫出狀態轉移方程,大家也就明白了,為何要求全是正數了吧,直白一些,陣列的索引,怎麼可能為負呢?在計算的過程中,將和的情況儲存下來,用空間換時間,整個演算法的時間複雜度為o(n*m),不再是指數級。
**:
#include
#include
using namespace std;
int merge(int num, int n, int sum)
//列印出陣列來看看更直觀,可以省略
for(int i = 0;i<=n;i++)
return dp[n][sum];
}
int main()
;
printf("%d\n",merge(num,5,15));
system("pause");
return 0;
}
動態規劃 石子合併
題目描述 在乙個圓形操場的四周擺放n堆石子,現要將石子有次序地合併成一堆.規定每次只能選相鄰的2堆合併成新的一堆,並將新的一堆的石子數,記為該次合併的得分。試設計出1個演算法,計算出將n堆石子合併成1堆的最小得分和最大得分.輸入輸出格式 輸入格式 資料的第1行試正整數n,1 n 100,表示有n堆石...
石子合併動態規劃
在乙個園形操場的四周擺放n堆石子 n 100 現要將石子有次序地合併成一堆。規定每次只能選相鄰的兩堆合併成新的一堆,並將新的一堆的石子數,記為該次合併的得分。編一程式,由檔案讀入堆數n及每堆的石子數 20 選擇一種合併石子的方案,使得做n 1次合併,得分的總和最小 選擇一種合併石子的方案,使得做n ...
動態規劃 4
動態規劃 動態規劃所處理的問題是乙個多階段決策問題,一般由初始狀態開始,通過對中間階段決策的選擇,達到結束狀態。這些決策形成了乙個決策序列,同時確定了完成整個過程的一條活動路線 通常是求最優的活動路線 如圖所示。動態規劃的設計都有著一定的模式,一般要經歷以下幾個步驟。初始狀態 決策 決策 決策 結束...