这个问题相当简单,而且是直接的.However,我不能完全使用dp背包风格来解决它。我有办法解决这个问题,但由于每个面额的硬币数量有限(在这个问题中),这就产生了一个问题。我想要达到一个2d的重复,我可以用它来实现背包。我的实际解决方案运行良好,具体如下:
#include<iostream>
using namespace std ;
int main ()
{ int flag ;
int N,i ;
int sum ;
int counter ;
while (cin >> N >>sum )
{
counte
我通过回溯所有可能的解决方案来解决背包问题的变化。基本上,0表示项目不在背包中,1表示项目在背包中。成本是背包中所有物品的价值,我们正在努力实现尽可能低的价值,同时拥有每个“类”的项目。每次发现所有类的组合时,我计算所有项的值,如果它低于globalBestValue,则保存该值。我做这是verify()。
现在,我正在尝试优化递归回溯。我的想法是在数组生成时对其进行迭代,如果生成的数字的“成本”已经高于当前的最佳值,则返回生成器,因此当前生成的组合不能是新的最佳值,可以跳过。
然而,对于我的优化,我的回溯并不是生成所有的值,它实际上跳过了我想要找到的“最佳”值。你能告诉我问题出在哪里吗?
p
我遵循遗传算法的方法来解决背包问题,如所见。据我所知,他们使用的是直接值编码方案,而不是二进制表示。交叉函数如下:
def cxSet(ind1, ind2):
"""Apply a crossover operation on input sets. The first child is the
intersection of the two sets, the second child is the difference of the
two sets.
"""
temp = set(ind1) # Used i