1380. 邮票

状态表示:

\(f(i,j)\):从前\(i\)张邮票中选,总面值恰好为\(j\)所需的最少邮票数。

状态转移:

按照完全背包的转移方式。

\[f(i,j)=\min(f(i-1,j),f(i,j-v_i)+1) \]

边界:

\[f(0,0)=0 \]

const int N = 2e6+10;
int f[N];
int n, m;

int main() 
{
    cin >> m >> n;
    
    memset(f, 0x3f, sizeof f);
    f[0] = 0;
    for(int i = 0; i < n; i++)
    {
        int value;
        cin >> value;
        for(int j = value; j < N; j++)
            f[j] = min(f[j], f[j-value] + 1);
    }
    
    int res = 1;
    while(f[res] <= m) res++;
    cout << res - 1 << endl;
    //system("pause");
    return 0;
}
posted @ 2021-06-16 09:38  Dazzling!  阅读(29)  评论(0编辑  收藏  举报