题目链接见:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=1954
就问题进行一些证明
题目描述:
1 假设存在 a1,a2,a3......an个数,从中选取b1,b2,b3...bm 且满足 m<=n k1*b1+k2*b2+...+km*bm=N
并使得k1+k2+...+km最少之。
理论1:如果对于N>an*an;则k1+k2+k3+...+km<an;
证明:利用反证法,假设存在这样一个N(N>an*an);如果一个最优解是k1+k2+k3+...+km>an
用记号S表示部分和,S1=k1*b1, S2=k2*b2 ... ... Sm=N=k1*b1+...+km*bm,因为N是大于an的,所以肯定存在两个数满足下面
Si mod an = Sj mod an 也就是说 Si - Sj = k'*an;
则 kj*bj+ ... ... +ki*bi == k'*an 因为从bj到bi都是小于an的,所以
kj*bj+ ... + ki*bi =k'*an<kj*an+ ... ... + ki*an=(ki + ... +kj)*an
==> k'<(ki+ .. + kj)
也就是说我们可以用 k'个an来代替原来的结果能得到一个更好的结果,所以与假设相反,结论一是成立的
结合题意,我们可以把一个大N以内的 数先计算出 1 -- 10000以内的最优方案,记为dp,然后遍历这些方案,对于其中一 个数 i 我们是要计算 min (dp[i]+(N-i)/an) ;
利用这一点就可以把10000000000以内的数压缩到100*100以内 ,从而得解