题目链接: UVA12105
【题意】用不超过n(n<=100)根火柴摆一个尽量大的能被m(m<=3000)整除的正整数。
【分析】可以用dp[i][j]表示除以m余j的i位数最少需要多少火柴这个状态计算,转移方程是:用dp[i][j]+c[k]来更新dp[i+1][(j*10+k)%m](c[]是每个数字需要花费的火柴数量,k是当前枚举的数字)。可以避免高精度提高效率,但是怎么确定每一位上的数字都是什么呢,需要用dp[i][0]找到最大的i使得dp[i][0]不是INF(初始化dp[][]为INF),这样就可以确定这个最大数字有几位了(位数多的肯定比位数少的大),然后在计算每一位上最大可以是什么数字,从大到小枚举每一位上的数字,第一个使得sum+dp[i-1][s]+c[j]<=n的数字就是该位上的最大值(其中s是去掉这一位上的数字剩下的几位的余数为s时使得这个总的数字能被m整除)。
比如,m = 7,并且已知当前数字位数为3,首先试着让最高位为9,如果可以摆出9ab这样的整数,那么一定是最大的,那么怎样确定能否摆出9ab呢?因为900%7 = 4,所以s&#x