数DPリュック実施形態--- P1832 A + B問題(アップグレード)

P1832 A + B問題(アップグレード)

説明フェイス質問

プログラムの合計数を見つけるために、正の整数nを考えると、素数の数に分けます。

問題の解決策

私たちは、DPが達成リュック考えることができます

DPボードリュック番組タイトル数

F [I] = F [i]が+ F [I - [J] 

 

F [j]はj個の素数の複数で表される総数スキームを表します

 

ご注意ください

1.ないふるい間違っリニア:

  1)not_prime [MAXN] MAXN> = N

  2)のmemsetのnot_primeアレイ後、0,1初期化が素数ではありません

 2. 長い長いDPを開くためのプログラム番号の配列

 

コード

書式#include <iostreamの> 
の#include <cstdioを> 
する#include <cstdlib> 
書式#include <アルゴリズム> 
書式#include <cmath> 
の#include < 文字列 > 
の#include <CStringの> 
の#include <キュー> 使用して名前空間はstdを、
typedefの長い長いLL。
インラインint型リード()
{ int型 ANS = 0 チャー最後=を' '、CH = GETCHAR()。
    しばらく(CH < ' 0 ' || CH>

 
 

     9 ')最後= CH、CH = GETCHAR()。
    一方、(CH> = ' 0 ' && CH <= ' 9 ')ANS = ANS * 10 + CH- ' 0 '、CH = GETCHAR()。
    もし(最後== ' - ')ANS = - ANS;
    戻り値は、ANS; 
} 

INT N;
int型のプライム[ 1000年 ]、not_prime [ 1050 ]、CNT = 0 ;
LL F [ 5000 ]。

ボイドXXS()
{ 
    memsetの(プライム、0はsizeof (プライム))。
    memset(not_prime、0はsizeof (not_prime))。
    not_prime [ 0 ] = not_prime [ 1 ] = 1 以下のためにINT iが= 2 ; I <= N; I ++ ){
         場合(!not_prime [I])プライム[++ CNT] = I。
        INT J = 1 ; J <= CNT; J ++ ){
             場合(iは素数[j]を*> N)、ブレーク
            not_prime [私は =首相[J] *] 1 もし(I%、プライム[J] ==0ブレーク
        } 
    } 
} 

int型のmain()
{ 
    N = (読み取り)
    XXS(); 
    F [ 0 ] = 1 ;
    以下のためにINT iは= 1 ; I <= CNT; I ++ のためのINT J =プライム[I]; J <= N; J ++ 
         F [J] + = F [J = プライム[I]]。
    printf(" %のLLD \ n " 、F [N])。
    リターン 0 ; 
}

 

おすすめ

転載: www.cnblogs.com/xiaoyezi-wink/p/11972112.html