完全背包问题 欢乐赛2B

链接:https://ac.nowcoder.com/acm/contest/16806/B
来源:牛客网

即可能存在金额x不能被该货币系统表示出。例如在货币系统n=3, a=[2,5,9]中,金额1,3就无法被表示出来。
两个货币系统(n,a)和(m,b)是等价的,当且仅当对于任意非负整数x,它要么均可以被两个货币系统表出,要么不能被其中任何一个表出。

将货币系统化简 找到m最小的货币系统

题解:

首先 不能额外的添加其他的货币数量,所以原系统最小的货币一定要使用,并且只能从原有的货币类型里进行化简(删除) 我们将原有货币系统排序,问题转变成,用已有的货币类型 能否表达这个新的货币[用n种体积为v的无限量物体,能不能填满背包] 变成了一个完全背包问题 然后进行循环即可(暴力搜索每一个值).

代码:

   memset(f, 0, sizeof(f));
        f[0] = 1;
        for (int i = 1; i <= n; i++)
        {
            if (f[a[i]] == 1) continue;
            cnt++;
            for (int j = a[i]; j <= a[n]; j++)
                if (f[j - a[i]]) f[j] = 1;
        }

 

posted @ 2021-07-08 23:58  旅玖旅玖  阅读(11)  评论(0编辑  收藏  举报