トピック:https://nanti.jisuanke.com/t/41420
アイデア:01リュックサックプログラム
(a∈S「)が最小である場合
和(S ') - a≤Sum(S-S' の場合)を設立
次に、(∀t∈S '和(S') - t≤Sum(S-S「))を設立し、一定
すなわち、現在の降順A [i]の石の選択された最小値に対する
#include <ビット/ STDC ++ H> 使用して 名前空間STDを、 const int型 MOD = 1E9 + 7 。 int型 [ 400 ]。 int型の DP [ 150001 ]。 INT CMP(INT A、INT B) { 戻り > Bと、 } int型のmain() { int型T。 scanf関数(" %のD "、&T)。 int型のn; 一方、(T-- ) { scanf関数(" %dの"、&N) int型 S = 0、ANS = 0 ; 以下のために(INT iが= 0 ; I <N; I ++)のscanf(" %dの"、および[I])、Sを+ = [I]。 ソート( +のN、CMP)。 memsetの(DP、0、はsizeof DP)。 DP [ 0 ] = 1 ; 以下のために(INT iが= 0 ; I <N; I ++ ) のための(INT J = S; J> = [I]; j-- ) { 場合(J> = SJ && JA [I] <= SJ)ANS =(ANS + DP [JA [I])%のMOD。 DP [J] =(DP [J] + DP [JA [I])%のMOD。 } のprintf(" %dの\ n " 、ANS)。 } 戻り 0 。 }