正の整数nは正の整数のシリーズとして表され、N = N2 + N1 + ... + NK、 N1> = N2> = ...> = NK> = 1、K> = 1。
これは、正の整数を表す。nは正の整数であり、nはパーティションと呼ばれています。異なる正の整数nの数を分割する分割数nは、正の整数と呼ばれます。
5サンプル出力
7+ 1ःINT5、4、+ 2、+ 1 + 1 3、+ 2 + 1 2、2 + 1 + 1 + 1、1 + 1 + 1 + 1 + 1
#include <cstdioを> する#include <iostreamの> する#include <CStringの> する#include <アルゴリズム> 使用して 名前空間STDを、 int型のn; int型の F [ 100 ] [ 100 ]; //和为I最大值为J int型のmain() { ため(int型 i = 1 ; iは<= 55 ; iは++)F [ 0 ] [I] = 1 。 以下のために(int型 i = 1 ; iは<= 55 ; I ++ ) { ための(int型 J = 1 ; J <=55 ; J ++ ) { 場合)は、(i <jの[I] [J] = F F [i]は[J- 1 ]。 他の 場合(I> j)はF [I] [j]は[IJ] F = [J] + F [I] [J- 1 ]。 他 [I] [J] = F 1 + F [I] [J- 1 ]。// COUT << "I =" << I << " "<<" J = "<< J <<"" << F [I] [J] << ENDL。 } } 一方(scanf関数(" %のD "、&N)=!EOF) { のprintf(" %Dを\ n " 、F [N] [N])。 } 戻り 0 。 }
他の人のコード......
竹ナップザック問題である必要があり、私は再び書かれたコードを見つけます
書式#include <cstdioを> する#include <CStringの> の#include <アルゴリズム> 使用して 名前空間はstdを、 const int型 MAXN = 60 ; int型[MAXN] [MAXN]、ANS F、N。 INT メイン() { [F 0 ] [ 0 ] = 1 。 以下のために(int型 i = 1 ; iは= < 55 ; iは++ ) { ため(int型の J = 1 ; J <= I; J ++ ) { F [I] [J] = F [I- 1 ] [J-1 ] + F [I- J] [J]。 } } 一方(scanf関数(" %のD "、&N)== 1 ) { ANS = 0 。 以下のために(int型 i = 1 ; iが<= N; iは++)ANS + = F [N] [i]は、 printf(" %d個の\ n " 、ANS)。 } 戻り 0 。 }
そして、私は分離のコレクションに、我々は大列挙に小さいので、我々は前の例のシーケンスを見つける必要があるため、jの最大値は、例数で計算しました。
どのようにそれを転送しますか?繰り返さないために、我々は、既知の配列に直接加数、およびすべてのiおよびI-1、I、Jに最大値j-1 + 1の最大値場合のから入手可能です。
最大jからjの値とIJに結合することができる、最大値が変更されていません。
私たちが列挙されていることに注意してください、最大値は最大値が3で、最大値は2で、1です......