-1

問題は:

ここに画像の説明を入力

私が思いついたアルゴリズムは次のようなものです。

pair<bool, bitmask>[n][A] memo;     
// memo[i][j].first will be true if its possible to 
// use up to i-th denomination for amt j
// memo[i][j].second will contain info on which 
// denominations are used
for i = 0 to n:
    for j = 1 to A:
    if (i==j): C[i][j] = {true, {i}}
    else if (C[i-1][j].first == true): C[i][j] = C[i-1][j]]
    else if (...see recurrance relation...): 
        C[i][j] = {true, C[i-1][j]+{denom[i]}}
    else: C[i][j] = false

ここまでは正しいですか?しかし、その正しさをどのように証明できるかわかりません...私の試みは、コードを英語で書き直したように見えます...

第 1 の場合: amt=i を解くために、金種 i の硬貨 1 枚を常に使用できます。最初の場合は、現在の金種を使用せずに amt の解決策がある場合、その解決策を再利用できます。2番目のelse if:現在の金種が使用でき(<= amt)、金種が使用されていない場合、...

複雑さについて: テーブルのサイズは nA です。また、各セルがいっぱいになるまでに O(1) 時間かかります。誰かが私を正しい方向に向けるのを助けることができますか?

4

1 に答える 1