题目链接:http://acm.tzc.edu.cn/acmhome/problemdetail.do?&method=showdetail&id=1662
题目大意:有n种硬币,其中面值v[i]的硬币有c[i]个,需要支付金额t,并且可以找钱,问交易的硬币数(支付的硬币数和找零的硬币数之和)最小为多少。
分析:先说不可找零的情况,用dp[i][j]表示用前j种硬币支付金额i需要的最少硬币数,那么
dp[i][j] = min{dp[i - v[j] * k][j - 1] | 0 ≤ k ≤ i / v[j]}
即枚举第j种硬币用k个。也可以表示成一种更简单的形式
dp[i][j] = min(dp[i][j - 1], dp[i - v[j]][j] + 1)
即讨论第j种硬币是否使用,若不使用,dp[i][j] = dp[i][j - 1];若使用,至少使用一个,剩下的就是支付金额i - v[j]所使用的硬币数,故dp[i][j] = dp[i - v[j]][j] + 1。
下面再说可以找零的情况,其实只需要枚举找零的金额即可。那么找零金额可能是多少呢?给一个比较大的上界就行了。(不要认为找的钱不超过面额最大值,因为硬币面额不一定有整除关系。比如用10个面额9和10个面额10的硬币支付2元钱,就应该支付两个10元,然后找零2个9元)
#include
#include
#include
#include
#include
#include