题目:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=2156
题意:charlie有四种硬币,价值分别为1,5,10,,25,给定每种价值硬币的个数,求出能够刚好买下coffee的硬币的个数,硬币应该尽可能的多,并且选出的硬币的价值之和要正好等于coffee的价值。
类型:多重背包问题
思路:1)在本题中最大的难点在于怎么记录每种硬币的个数。方法是构造一个数组pre,pre[j]=j-b[i],将pre初始化为0,然后将pre[0]初始化为-1。
2)用一个used数组表示该种硬币的使用情况,used[j]=used[j-b[i]]+1;当used大于该种硬币的数目时,那么就要开始不挑选本种硬币,开始下一层循环。
3)定义dp数组表示i元最多用多少枚硬币,同时也表示i元能否用已有的硬币表示,真为1,假为0,故首先将dp置为0,然后将dp[0]置为1。
4)约束条件为if((!dp[j]||dp[j-b[i]]+1>dp[j])&&dp[j-b[i]]&&used[j-b[i]]+1<=a[i]),表示dp[j]为求解,或者dp[j]不够大,并且dp[j-b[i]]不为0(能够用已有的硬币表示)同时,该 种硬币还足够,那么才能进入循环,进行更新。
#include<cstd