acwing532通貨システム

トピック

ここに画像の説明を挿入

回答

  1. 2つの通貨システムが同等である場合、次のプロパティがあります

プロパティ1:a1、a2、a3 ... anを表す必要があります。
プロパティ2:最適解では、b1、b2、b3 ... bmはa1、a2、a3 ... an
3から選択されたプロパティである必要があります。 b1、b2、b3 ... bmを他のbiで表すことはできません

  1. 配列を小さいものから大きいものに並べ替えます

(1)aiをa0–ai-1で表すことができる場合、その数はb配列に含まれていてはなりません。
(2)aiをa0–ai-1で表せない場合、その数はb配列に含まれている必要があります。

  1. 任意の数a0—ai-1がaiを表すことができるかどうかを見てみましょう。これは、解の数を見つけるために完全なナップサック問題に変換されます。

コード

#include<bits/stdc++.h>

using namespace std;
const int N = 110, M = 25010;

int t, n;
int a[N];
int f[M];

int main() {
    
    

    cin >> t;
    while (t--) {
    
    
        memset(f, 0, sizeof f);
        cin >> n;
        for (int i = 1; i <= n; i++) cin >> a[i];
        sort(a + 1, a + 1 + n);
        int m = a[n];
        int res = 0;
        f[0] = 1;
        for (int i = 1; i <= n; i++) {
    
    
            if (!f[a[i]]) res++;
            for (int j = a[i]; j <= m; j++) {
    
    
                f[j] += f[j - a[i]];
            }
        }
        cout << res << endl;
    }


    return 0;
}

おすすめ

転載: blog.csdn.net/qq_44791484/article/details/115302301