劃分型dp。最終的思路是,f[i][j]表示i分成j份,如果分出來的有1,那麼去掉1,就是f[i-1][j-1];如果沒有1,那就都減1,就是f[i-j][j](注意此時i>=2j)。那麼f[i][j]=f[i-1][j-1]+f[i-j][j]
詳細些的話,以sample為例:
7=5+1+1;
7=2+4+1;
7=3+3+1;
7=2+2+3;
我們可以把所有數的拆分分成2種情況,有1和沒有1的2種
那麼有1的部分全部減去1,變成
6=5+1;
6=2+4;
6=3+3;
這就是6的所有劃分成2部分的劃分了。
沒有1的,我們把沒有1的所有因子全部減去1
得到4=1+1+2;
這就是4的所有劃分成3部分的劃分了
這個推導其實一時難以想到,這篇文章裡有個轉化和推導,圖有點意思,雖然最終還是上面的簡潔直接:
關於怎麼想到f[i-j][j]這樣的東西的,某人說,n個球放到k個盒子,因為盒子不為空,那麼我先把每個盒子放乙個球。這也是某種思路的**吧。
#include #include #include #include #define max(a, b) a>b?a:b#define len_n 205
#define len_k 10
using namespace std;
int f[len_n][len_k];
int n;
int k;
void init()
int dp(int i, int j)
int main()
wikioi 數的劃分
題目描述 description 將整數n分成k份,且每份不能為空,任意兩種劃分方案不能相同 不考慮順序 例如 n 7,k 3,下面三種劃分方案被認為是相同的。1 1 5 1 5 1 5 1 1 問有多少種不同的分法。輸入描述 input description 輸入 n,k 6 題解 f i,j ...
Wiki OI 1039 數的劃分
演算法與思路 劃分型dp,遞推 將整數n分成k份,且每份不能為空,任意兩份不能相同 不考慮順序 例如 n 7,k 3,下面三種分法被認為是相同的。1,1,5 1,5,1 5,1,1 因此將n劃分份的一種方法唯一的表示為n1 n2 nk,其中n1 n2 nk.這樣可以形象地把n的k份劃分看作是把n塊積...
A 數的劃分
a 數的劃分 將整數n 分成 k份,且每份不能為空,任意兩個方案不相同 不考慮順序 例如 n 7,k 3,下面三種分法被認為是相同的。1,1,5 1,5,1 5,1,1 問有多少種不同的分法。輸入格式 第一行有兩個整數 n,k 6sample input 7 3 sample output 解題思路...