關於一些數的劃分問題

2021-08-03 10:44:39 字數 1188 閱讀 9904

問題一:將n劃分為若干正整數之和,有多少種劃分方法?(hdu1028)

思路一:相當於1-n的完全揹包,總重量為n,有多少種組合?

思路二:dp[i][j]表示將i分為最多j組的劃分方法數

轉移方程為:dp[i][j] = dp[i][j-1] + dp[i-j][j] (i < j)  //前者表示至多分成j-1份,後者表示分成j份(將i-j分成j份,剩下的j分成j個1加到剛剛的j份)

dp[i[j] = dp[i][j-1] + 1(i = j)

dp[i][j] = dp[i][i] (j > i)

問題二:將n劃分為m個正整數之和,有多少種劃分方法?

思路一:相當於1-n的完全揹包,不過加了一維狀態(二維費用揹包)

思路二:dp[i][j]表示將i分為j組的劃分方法數

轉移方程為:dp[i][j]  = dp[i-1][j-1] + dp[i-j][j](j <= i) //前者表示先分出乙個1作為乙份,然後剩下的i-1分成j-1份(至少有乙個1),後者表示先分出j個1再將i-j分成j份,將他們加進去

dp[i][j] = 0(j > i)

問題三:將n劃分為最大數不超過k的劃分數

完全揹包,不過可選範圍變成1-k

問題四:將n劃分為若干奇正整數之和

思路一:g[i][j]:將i劃分為j個偶數;f[i][j]:將i劃分為j個奇數

g[i][j] = f[i - j][j];f[i][j] = f[i - 1][j - 1] + g[i - j][j];

方法可以分為兩類:

第一類:i中拿出j個1分到每乙份中,將剩餘的i-j分成j個奇數

第二類:乙份包含奇數1,剩餘的i-1分成j-1個奇數;另一種,每份至少大於1,將j個1拿出來分到每乙份中,其餘i-j分成j份

思路二:完全揹包問題

問題五:將n劃分為若干不同整數之和,有多少種?

思路一:0/1揹包問題

思路二:

dp[n][m]= dp[n][m-1]+ dp[n-m][m-1]   dp[n][m]表示整數 n 的劃分中,每個數不大於 m 的劃分數。

分兩種情況:

a.劃分中每個數都小於m,相當於每個數不大於 m-1,劃分數為 dp[n][m-1].

b.劃分中有乙個數為 m.在n中減去m,剩下相當對n-m進行劃分,

並且每乙個數不大於m-1,故劃分數為 dp[n-m][m-1]

關於回文數的一些題目

所謂回文數,就是說乙個數字從左邊讀和從右邊讀的結果是一模一樣的,比如12321。判斷一字串是否是回文字串 include include using namespace std int fun string s if i len cout s 是回文字串 else cout s 不是回文字串 ret...

一些關於測試的問題

1.有一根不均勻的繩全部燒完用1個小時,現在有很多材質,規格完全相同的繩,怎麼用燒繩法計時1個小時15分鐘?我的回答 用一根繩做標記,另一根繩,兩頭開始燒,燒到一塊的位置,表在第一根繩上,這是半個小時的時間同理找到1 4個小時的位置,進而可以得到乙個小時15分鐘啊 2.什麼是冒煙測試?冒煙測試 sm...

關於一些空指標異常的一些問題

listschedultcustomproductids new arraylist if schedultcustomproductids null 這樣是不能阻擋getbyids 方法的執行的 size 0和null是不同的,new完以後,是會給他分配記憶體的,是size 0,因為給他分記憶體了...