此题就是赤裸的01背包问题,不过路径是个问题,一开始用逆推得到的程序最后一组数据与题目不符合,我尝试交了一发竟然A了,不过发觉最后一组是按字典序,逆推得到的即不是反字典序也不是字典序。。只不过是其中一组解,此题用的是special judge所以都可以过,我决定想办法得到字典序最小的路径。
最后当然解决了,用vector去保存每一个到达这个背包体积的字典序最小路径,如果遇到当前物品放入的价值跟不放入的价值是一样的,就需要对比2个路径了,从2个vector的头开始对比,如果前者的大于后者,那么就不更新,不放入的字典序最小,反之就更新。
放2个测试数据:
9 4 1 3 4 5
9 4 1 4 3 5
2个答案都是1 3 5 sum:9
这里放2个AC代码,前者是普通的逆推,后者则是字典序输出的路径,速度肯定是前者快。
code 1:
#include<cstdio>
#include<ctype.h>
#include<alg