単純な整数除算の問題 - 2時間の死の闘争

 

正の整数nは正の整数のシリーズとして表され、N = N2 + N1 + ... + NK、 N1> = N2> = ...> = NK> = 1、K> = 1。
これは、正の整数を表す。nは正の整数であり、nはパーティションと呼ばれています。異なる正の整数nの数を分割する分割数nは、正の整数と呼ばれます。

テストデータの複数のセットを含む入力標準入力。各試験は、整数N(0 <N <= 50)です。各テストのための出力は、分割数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です......

 

 

おすすめ

転載: www.cnblogs.com/WHFF521/p/11228856.html