问题描述:coins
Silverland的人们使用硬币。他们有价值A1,A2,A3的硬币…一个Silverland美元。有一天Tony打开他的钱箱,发现有一些硬币。他决定在附近的商店买一块非常漂亮的手表。。 他想支付确切的价格(没有变化),他知道价格不会超过m。但他不知道手表的确切价格。
你要编写一个程序,读取n,m,A1,A2,A3 … An和C1,C2,C3 … Cn对应于值为A1,A2,A3 …的Tony的硬币数量 计算托尼可以支付使用这些硬币的价格(1到m)。
题解
我们设 f [ j ] f[j] f[j]表示体积为 j j j是否能拼出。
完全背包的可达性问题其实可以转化为一个贪心问题:
- 加入对于每一个物品 i i i来说,假设已经知道了前 i − 1 i-1 i−1件物品组合出的答案。由于有物品数的限制,我们可以尽量让少的物品组成更多的数,避免无效的浪费。
- 例如:放 f [ j ] = 1 f[j]=1 f[j]=1时已经组成,就不用浪费这个次数了;否则当 f [ j − a [ i ] ] = 0 f[j-a[i]]=0 f[j−a[i]]=0且 f [ j ] = 1 f[j]=1 f[j]=1时才选用这个物品。正好对应了上述思想。
- 至于具体的操作,我们用一个数组 u s e [ j ] use[j] use[j]表示拼成体积为j时最少需要多少物品 i i i,和 f f