题目链接见: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以内 ,从而得解