日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

转载 - 整数划分问题

發(fā)布時間:2023/11/30 编程问答 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 转载 - 整数划分问题 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

出處:?http://www.cnblogs.com/wanghetao/archive/2013/11/25/3442192.html

整數(shù)劃分 --- 一個老生長談的問題:

描述

整數(shù)劃分是一個經(jīng)典的問題。請寫一個程序,完成以下要求。

?

?

輸入
每組輸入是兩個整數(shù)n和k。(1 <= n <= 50, 1 <= k <= n)
輸出
對于輸入的 n,k;
第一行: 將n劃分成若干正整數(shù)之和的劃分數(shù)。
第二行: 將n劃分成k個正整數(shù)之和的劃分數(shù)。
第三行: 將n劃分成最大數(shù)不超過k的劃分數(shù)。
第四行: 將n劃分成若干個 奇正整數(shù)之和的劃分數(shù)。
第五行: 將n劃分成若干不同整數(shù)之和的劃分數(shù)。
第六行: 打印一個空行
樣例輸入
5 2
樣例輸出
7 2 3 3 3
提示
樣例輸出提示:
1.將5劃分成若干正整數(shù)之和的劃分為: 5, 4+1, 3+2, 3+1+1, 2+2+1, 2+1+1+1, 1+1+1+1+1
2.將5劃分成2個正整數(shù)之和的劃分為: 3+2, 4+1
3.將5劃分成最大數(shù)不超過2的劃分為: 1+1+1+1+1, 1+1+1+2, 1+2+2
4.將5劃分成若干 奇正整數(shù)之和的劃分為: 5, 1+1+3, 1+1+1+1+1
5.將5劃分成若干不同整數(shù)之和的劃分為: 5, 1+4, 2+3

?

?

下面是我根據(jù)網(wǎng)上的資料, 寫出自己的分析和實現(xiàn)過程.

分析:

?

本題使用動態(tài)規(guī)劃(Dynamic Programming)方法解決

一 求將n劃分為若干正整數(shù)之和的劃分數(shù)

?

1.?若劃分的多個整數(shù)可以相同

  設dp[i][j]為將i劃分為不大于j的劃分數(shù)

  (1) 當i<j?時,i不能劃分為大于i的數(shù),所以dp[i][j]=dp[i][i];

  (2) 當i>j?時,可以根據(jù)劃分中是否含有j分為兩種情況。若劃分中含有j,劃分方案數(shù)為dp[i-j][j];若劃分數(shù)中不含j,相當于將i劃分為不大于j-1的劃分數(shù),為dp[i][j-1]。所以當i>j時dp[i][j]=dp[i-j][j]+dp[i][j-1];

  (3) 當i=j?時,若劃分中含有j只有一種情況,若劃分中不含j相當于將i劃分為不大于j-1的劃分數(shù)。此時dp[i][j]=1+dp[i][j-1]。

dp[n][n]可以解決問題1,dp[n][k]表示將n劃分為最大數(shù)不超過k的劃分數(shù),可以解決問題3。

?

2.?若劃分的正整數(shù)必須不同

  設dp[i][j]為將i劃分為不超過j的不同整數(shù)的劃分數(shù)

  (1) 當i<j時,i不能劃分為大于i的數(shù),所以dp[i][j]=dp[i][i];

  (2) 當i>j時,可以根據(jù)劃分中是否含有j分為兩種情況。若劃分中含有j,則其余的劃分中最大只能是j-1,方案數(shù)為dp[i-j][j-1];若劃分中不含j,相當于將i劃分為不大于j-1的劃分數(shù),為dp[i][j-1]。所以當i>j時dp[i][j]=dp[i-j][j-1]+dp[i][j-1];

  (3) 當i=j時,若劃分中含有j只有一種情況,若劃分中不含j相當于將i劃分為不大于j-1的劃分數(shù)。此時dp[i][j]=1+dp[i][j-1]

?

dp[n][n]表示將n劃分為不同整數(shù)的劃分數(shù),可以解決問題5.

?

二 將n劃分為k個整數(shù)的劃分數(shù)

dp[i][j]為將i劃分為j個整數(shù)的劃分數(shù)。

  (1)?i<j為不可能出現(xiàn)的情況,dp[i][j]=0;

  (2) 若i=j,有一種情況:i可以劃分為i個1之和,dp[i][j]=1;

  (3) 若i>j,可以根據(jù)劃分數(shù)中是否含有1分為兩類:若劃分數(shù)中含有1,可以使用“截邊法”將j個劃分分別截去一個1,把問題轉(zhuǎn)化為i-j的j-1個劃分數(shù),為dp[i-j][j-1];?若劃分中不包含1,使用“截邊法”將j個劃分數(shù)的最下面一個數(shù)截去,將為題轉(zhuǎn)化為求i-j的j個劃分數(shù),為dp[i-j][j]。所以i>j時dp[i][j]=dp[i-j][j-1]+dp[i-j][j]。

?

dp[n][k]為將n劃分為k個整數(shù)的劃分數(shù),可解決問題2。

?

?

三 將n劃分為若干正奇數(shù)之和的劃分數(shù)

?

f[i][j]為將i劃分為j個奇數(shù)之和的劃分數(shù),g[i][j]為將i劃分為j個偶數(shù)之和的劃分數(shù)。

使用截邊法,將g[i][j]的j個劃分都去掉1,可以得到f[i-j][j],所以

g[i][j] = f[i-j][j]。

f[i][j]中有包含1的劃分方案和不包含1的劃分方案。對于包含1的劃分方案,可以將1的劃分除去,轉(zhuǎn)化為“將i-1劃分為j-1個奇數(shù)之和的劃分數(shù)”,即f[i-1][j-1];對于不包含1的劃分方案,可以使用截邊法對j個劃分每一個都去掉一個1,轉(zhuǎn)化為“將i-j劃分為j個偶數(shù)之和的劃分數(shù)”,即g[i-j][j]。

所以f[i][j]=f[i-1][j-1]+g[i-j][j]。

f[n][0]+f[n][1]+……+f[n][n]為將n劃分為若干奇數(shù)的劃分數(shù),為問題4的答案。

?

參考: [1]??http://blog.csdn.net/a83610312/article/details/12685653

???????? [2]??http://www.cnblogs.com/jackge/p/3163835.html

轉(zhuǎn)載于:https://www.cnblogs.com/sineatos/p/4089167.html

總結

以上是生活随笔為你收集整理的转载 - 整数划分问题的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。