缘起
学习完全背包. poj 1384 Piggy-Bank
分析
1 | 一个存钱罐,给出空罐子的时候它的重量与存满硬币的时候的重量,然后给你钱币的种数以及每种钱币的价值与重量,然 |
首先说一下完全背包问题是什么. 【1】中介绍了01背包问题. 里面说到了每个物品只能取或不取. 而完全背包和01背包问题的唯一区别就在于完全背包允许你每种物品随意取多少件.
再说说完全背包问题的算法. 和【1】中01背包问题的算法唯一的区别在于(dp的意义与【1】完全一样)
1 | dp[v=0,...,V]=0 |
为什么变了一个内层循环遍历的顺序就是完全背包了呢? 也就是可以任取多少件了呢? 很简单~ 你想想就知道了.
下面回到本题. 本题其实就是一个完全背包问题——把硬币的价值看成w, 把硬币的重量看成c,而V就是F-E
只不过这里是求最小价值. 而且还必须装满背包. 所以dp的含义变成
1 | dp[i][j]=前i件物品恰好装满容量为j的背包下的最小价值. 0<=i<=N |
则 dp[0][0] = 0, 而dp[0][j] = inf(因为根本办不到,参见【1】)
然后开始进行dp, 其中dp公式变成
1 | dp[j] = min{dp[j], dp[j-c]+w} |
好了,下面是ac代码
1 | //#include "stdafx.h" |
ac情况
Status | Accepted |
---|---|
Time | 47ms |
Memory | 124kB |
Length | 730 |
Lang | C++ |
Submitted | 2019-08-19 13:25:52 |
Shared | |
RemoteRunId | 20766394 |
参考
Powered By Valine
v1.5.2
v1.5.2