Leetcodeインタビューの質問08.11。コイン
アイデアについては、この兄のを参照してください
一見するとdpで書かれているように感じられます。nポイントの表現の数を質問すると、最後のコインの額面jを与えると、質問はnjポイントの数に変換されます表記なので、副問題になります。
最初は、額面金額を使用してコインスキームの数を決定することを考えていました。転送方程式は、dp [i] =(dp [i-1] + dp [i-5] + dp [i-10] + dp [i-25]です。 )dp [i]はスキームのポイント数を意味しますが、伝達方程式dp [6] = dp [5] + dp [1] = 3の場合、これは6など間違っていますが、実際の答えは2です。 、実際の6は5 1と1 1 1 1 1 1 1で構成されていますが、dp伝達方程式に従って記述された場合、6は5 1と1 5と1 1 1 1 1 1で構成されます。数が多いとわかったら、このように書くのは間違いです
方法:額面金額を決定するためにコインを使用することを選択し、最終結果の各ソートが低下してはならず、重み付けなしで実行できます
const int maxn = 1e6+50;
const int MOD = 1e9+7;
int dp[maxn];
class Solution {
public:
int num[4] = {1,5,10,25};
int waysToChange(int n) {
memset(dp,0,sizeof(dp));
dp[0] = 1;
for(int i = 0; i < 4; i++){
for(int j = 1; j <= n; j++){
if(j >= num[i]) dp[j] = (dp[j]+dp[j-num[i]])%MOD;
}
}
return dp[n];
}
};
概要:動的な計画を作成するときに、アイデアが間違っているか不完全であることがわかった場合は、元のアイデアの抜け穴を埋めるのではなく、方向を変えて問題について考える必要があります