これは、DPの問題のUSACOで、難易度が改善することです - 。
この質問は、プログラムの種類の最大数の額面を形成するためにお金を使う、あなたを聞いて、私たちの通貨を伝えることです。一見、私は、ラジオ片を取ることができ、DFSのメモリを使用して、この問題は完全なバックパックに非常によく似ていることを見つけるしたいと思いますが、彼は普通の伝達方程式は異なるのです。そして、私が出てくるしたくなかった、初めについて考えるために停止しませんでした。最終的にDPを締結[j]はDP [J] + DP [J-コイン[I]を=。最後に、出力DP [T]です。
1.深刻な式を適用住むません、あなたが気にしないように、困難を恐れない、いくつかの例を推測しなければならない、状態遷移方程式を導き出します
jへのループ変数iが特に+で、混同しないでくださいということ2.注意
3.意味を表す[] DPの質問の意味に応じて、異なる識別
4.このようなタイトルDP [0] = 1として、DP []のために初期化する。思慮あること
コード
#include <iostreamの> する#include <cstdioを> する#include < ストリング > の#include <CStringの> する#include <cmath> の#include <iomanip> の#include <アルゴリズム> の#define N 1000001 の#defineが長い長いllの 使用 名前空間STD。 INT T、N。 int型のコイン[N]。 LL ANS = 0 。 LL DP [N]。// 当前面额存在最大方案数 INT メイン(){ CIN >> N >> T。 以下のための(int型 I = 1; iが<= N; iは++ ){ scanf関数(" %dを"&コイン[I])。 } DP [ 0 ] = 1 。 用(int型 iは= 1 ; iが<= N iが++ ){ ため(INT J =コイン[I]; J <= T; J ++ ){ DP [j]は DP [J] + DP [J- = コイン[Iを]。 } } COUT << DP [T]。 リターン 0 ; }