[ソース]
2018焦作市のネットワークゲーム
リファレンス[ブログ]
https://blog.csdn.net/baymax520/article/details/82719454
[タイトル]イタリア
ボートのN種類があり、各容器の貨物容量をv [i]が、各容器は、2 ^ Cを持っている[i]が-1種は、倍のクエリqがあり、それぞれが尋ねたどのように多くの貨物容量Sを埋めるための方法。
[思考]
01バックパックは、裸の場合、時間計算量はO(N * 2 ^ C [I] * 10000)であり、明らかにタイムアウトが、我々は、各容器を置くことができるように、2 ^ X-1ボート(S)容器として、一緒にしましたそれは、2 ^ 0 + 2 ^ 1 + 2 ^ 2 + ... + 2 ^(X-1)に分割される1〜2 ^ X-1が分割されている任意の数のは、いくつかの組成物から形成されていてもよいです、 01バックパックのために結合されたすべての結果とすることができます。
1の#include <cstdioを> 2の#include <CStringの> 3の#include <アルゴリズム> 4 使って 名前空間STDを、 5 typedefの長い 長いLL。 6 のconst int型 M = 1E4 + 5 。 7 のconst int型 MOD = 1E9 + 7 。 8 LL DP [M]、V [ 25 ]、C [ 25 ]、V。 9 INT メイン() 10 { 11 int型、T、N、Q、S。 12 のscanf(" %d個"、&T); 13 一方(t-- ){ 14 のscanf(" %D%dの"、&N、&Q)。 15 のために(int型 i = 1 ; iが<= N; iが++ ) 16 のscanf(" %D%dの"、&V [i]は、&C [I])。 17 18 のmemset(DP、0、はsizeof DP)。 19 DP [ 0 ] = 1 。 20 のために(int型 i = 1 ; iが<= N; iが++ ){ 21 用(INTのk = 0 ; kは++; <C [i]のk個){ 22 V = 1LLの*のV [I] << K。 23 のために(INT J = M- 1 ; J> = V; j-- ){ 24 、DP [J] + = DP [J- V]。 25 DP [J]%= MOD。 26 } 27 } 28 } 29 のための(int型 I = 1 ; I <= Q; iは++ ){ 30 のscanf(" %dの"、&S)。 31 printf(" %LLDする\ n " 、DP [S])。 32 } 33 } 34 リターン 0 。 35 }