QUOTE(winnerthis @ Dec 30 2021, 00:35)

这种题如果追求效率可以用线性规划/非线性规划
线性规划需要事先假设能换几次 然后从结果倒推方案 我这里求到22的解只用了几秒钟 23的解可能有但10分钟还没解出来
非线性规划本质穷举 效率很低 10分钟才解求到19的解
如果你看重时间效率可以先拿线性规划算一算
附件是22的解

线性规划是存在Polynomial算法的,而且就算不用最优解法而只用单纯形法 也应该是近似Polynomial的,所以用线性规划解NP-Hard问题我觉得不太靠谱。
比如注意到你的结果里惊人的浪费:5994 出现了4次、5593、5544、5643等超过5500的也出现了6次,说明几乎肯定还有优化空间。
如果用你表里的结果,注意到849有60个是最多的,而5*849+1*799只浪费44,那先把849用光,剩下
CODE
(5*849+1*799)*12
404 799 999
25 23 30
然后此时最优的方法是 999*3+799*1+404*3=5008 (我想这个应该是最优组合了?)
剩下
CODE
(999*3+799*1+404*3)*8
404 799 999
1 15 6
然后 999*1+799*5+404=5398
剩下
CODE
(999*1+799*5+404)*1
799 999
10 5
然后799*5+999*2=5993
剩下
CODE
(799*5+999*2)*2
999
1
轻易得到 12+8+1+2=23的结果。
~~~~~~~~~~~~~~~~~~~~~~~~~
然后,按照我的Greedy Algorithm的算法:
从上面的组合里 浪费最低的是 404*3+799+999*3。能用这个就一直用。然后每次找浪费最小的组合 (Greedy的组合是猜的,不过我想应该不难算?):
(括号里的是用掉的,下一行是剩下的)
CODE
404 799 849 999
25 35 60 30
(3 1 3) *8
1 27 60 6
(1 2 3)*1
27 58 3
(1 5)*11
16 3 3
(2 3 1)*1
14 2
(4 2)*1
10
(6) *1
4
最终结果=8+1+11+1+1+1=23
所以得到23并不困难,多种算法都能给出。你的算法找不到,那就不知道问题出在哪里了。