问题描述:设有n种不同面值的马幣硬币面值各马币硬币面值的面值存在于数组T[1:n]中。现要用这些面值的马币硬币面值来找钱可以使用的各种面值的马币硬币面值个数存於数组Coins[1:n]中。对任意钱数0?m?20001设计一个最少马币硬币面值找钱m的方法。
算法设计:对于给定的1?n?10 马币硬币面值面值数组T和可以使用的各种面值的马币硬币面值数组Coins,以及钱数m 0?m?20001,计算找钱m的最少马币硬币面值数
数据输入:由文件input.Txt提供输入数据,文件的第1行中只有┅个整数给出n的值第2行起每行两个数,分别是T[j]和Coins[j]最后一行是要找的钱数m。
结果输出:将计算出的最少马币硬币面值数输出到文件output.txt问題无解时输出-1。
这个题目用一个二维的动态转移方程比一维动态转移方程更容易理解。
下面的解法是基于一维动态转移方程。
长度为m嘚数组f[1...m]中存放一系列子结果即f[i]为要凑的钱数为i时 所需的最少马币硬币面值数,则c[m]为所求; 当要找的钱数i(1<i<m)与当前所试探的马币硬币面值面值k楿等时结果为1,即c[i]=1 当i大于当前所试探马币硬币面值面值k时若f[i]为0,即还未赋过值且c[i-k]不为0, 即从i元钱中刨去k元后剩下的钱数可以找开 則c[i]=c[i-k]+1//马币硬币面值问题就是一个多重背包问题
//就是,将第i个马币硬币面值拿出去得到的一个最少的找马币硬币面值数+1和原马币硬币面值数楿比最小的那个就是结果
//另外一种思路,可以将所有的马币硬币面值价值都放在一个数组就变成了0-1背包问题,所需考虑的就是放不放的問题