[コードテストC+]おつり


今日の質問
金をさがす
私の答え
#include <string>
#include <vector>
#include <algorithm>
#define MOD 1000000007;

using namespace std;

int solution(int n, vector<int> money) {
    
    vector<int> dp(n+1, 0);
    dp[0] = 1;
    for(int i=0;i<money.size();i++){
        for(int j= money[i];j<=n;j++){
            dp[j] += dp[j-money[i]];
        }
    }
    return dp[n];
}
模範解答
学ぶべきところ
  • を参照して回答した.
  • 昨日解答した問題と同じで、考えがはっきりしないで、見るとDPであることを知っていて、
  • DPの核心は、これまでよくできていたことで、今回の手順を考えていたのですが、この手順で個々の演算を実行しようとすると、それ以前に実行した操作と重なると、問題は解決できません.これは順番ではなく組み合わせです2が先に出てくる1と1が先に出てくる2は違います
  • からdfsで解決しようと思ったが、効率的にタイムアウトした.もちろん,nは100000以下の自然数であり,dfsですべての組合せを求めると大変なことになる.
  • わあ、これはどういうことですか.最後にヒントを見ました.これですか.
  • 最初のように
  • を実行すると、以前に実行された異なる演算の結果が反映され、各演算がDPを返すと、これらの結果は反映されません.順次追加これを見て、まだまだだと思います.