問題レポートにLuogu P1450コインショッピングソリューション

トピックポータル

[タイトル]効果

今何かを買うコイン$ cの4つの宗派[〜4 1] $、$ TOT $回は購入するものの合計金額は、あなたが何かを買うたびに[〜4 1] $ dを取るそれぞれのコインの額面の4種類を$があります$ S $、だけのものを購入するたびに求めているにプログラム番号(すなわち、コイン金種の合計が正確に$ S $を費やされています)。

[解析]アイデア

コインの数に制限がない場合はまず、完全にバックパックを期待して使いやすいです。だから我々は、制限なく、各プログラムの合計数をコインの枚数を前処理しました。

その後、数量制限に対処する方法を考え、数に一つだけのコイン限界があるという仮定は、このコインを強制的に制限を超えた場合、我々は他の硬貨の種類は$ S-(D + 1)に値を綴る使用する必要があります* C $。制限を超えているので、それはこれらのプログラムは合法ではないことは明らかである、プログラム番号$ fが[S-(D + 1)* C] $。だから我々は成功したコインプログラムの数は、全てのコインでのプログラムの数を引い制限を超えた数(ここではこれが唯一のコインが限度を超えているという保証はありません)、$ fの[S] $は、我々の後に限度が超えている知っていますこれは数がプログラムの制限を超えると同時に、コインの2種類のマイナスよりもさらにいくつかを考えることができます。ここで少しよく知っていますか?この問題は、最終的な答えがでなければなりませんので、解決含める排除を使用するために見つけることができることは明らかです。

$ F [S] - $コイン量はプログラム$ +の$実施形態の制限数コインの二種類が$の限界超える超過する - コインの$ 3種類のコインのプログラム$ + $四種類の制限数は、プログラムの制限数を超えて上回ります。

この$以上$それは!

[]コードの実装

1の#include <cstdioを>
 2の#include <iostreamの>
 3の#include <CStringの>
 4の#include <アルゴリズム>
 5の#include <cmath>
 6の#include <キュー>
 7  の#define G()GETCHAR()
 8  の#define RGレジスタ
 9  の#defineは <;(= BをI ++は(I、B)iがRG iは= INT)に行く
 10  の#defineバック(I、B)(RG iは= int型のために、I = B>。 i--)
 11  の#defineダブルDB
 12  の#defineは長い長いっ
 13  の#define ILインライン
 14  の#define PFのprintf
 15  の#defineMEM(A、B)のmemset(A、B、はsizeof(A))
 16  使用 名前空間STDを、
17  int型のFR(){
 18      INT W = 0、Q = 1 19      CHAR CH = G();
20      一方(CH < ' 0 ' || CH> ' 9 ' ){
 21          であれば(CH == ' - ')、Q = - 1 22          CH = G();
23      }
 24      ながら、(CH> = ' 0 ' && CH <=' 9 ')w <<(= W 1)+(W << 3)+ CH- ' 0 '、CH = G();
25      リターン * wのQ;
26  }
 27  INT C [ 5 ]、D [ 5 ]、TOT、S。
28 LLのF [ 100002 ]、ANS。
29  INT メイン(){
 30      // freopenは( ""、 "R"、STDIN)。
31      // freopenは( ""、 "" W、STDOUT)。
32      ゴー(I、14)C [I] = frの(); TOT = FR()。
33      F [ 0] = 1 34      ゴー(I、14)移動(J、C [i]は、100000)F [J] + = F [J- C [i]は]。
35      一方(tot-- ){
 36          のANS = 0 37          ゴー(I、14)D [I] = frの(); S =のFR()。
38          ゴー(I、015){ // 2 ^ 4 = 16 
39              のint T = S、タイプ= 0 40              行く(J、14の場合((I >>(J- 1))&1)= T-C [J] *(D [J] + 1)、タイプ^ = 1 ; // 撥ビット単位の表現を受信し
 41              // 現在のビットが限界の外に強制的に1で             
ある42              IF(T < 0続行し43は             IF!(タイプ)+ ANS = F [T]; // 制限的な実施形態の外側に追加するコインの偶数タイプ
44である             他は ans- = F [T]; // コインの奇数の種類はスキームを減算する限界を超えます
45          }
 46は、          PF(" %のLLDの\のN- " 、ANS);
 47      }
 48      リターン 0 ;
 49 }
コードはここで突きます

おすすめ

転載: www.cnblogs.com/THWZF/p/11592759.html