【发布时间】:2015-06-22 12:53:49
【问题描述】:
我发现这段代码使用蛮力机制解决背包问题(这主要是为了学习,所以不需要指出动态更有效)。我得到了代码,并且理解了其中的大部分内容。最多。问题来了:
我注意到这两个条件,我不知道它们是如何工作的以及为什么它们在代码中 - 我知道它们至关重要,因为我所做的任何更改都会导致算法产生错误的结果:
// if bit not included then skip
if (((i >> j) & 1) != 1) continue;
// if bit match then add
if (((bestPosition >> j) & 1) == 1)
{
include.Add(Items[j]);
}
这是整个班级,以及我从 main 中调用它的方式:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace KnapSack2
{
class BruteForce
{
public double Capacity { get; set; }
public Item[] Items { get; set; }
public Data Run()
{
int bestValue = 0;
int bestPosition = 0;
int size = Items.Length;
var permutations = (long)Math.Pow(2,size);
for (int i = 0; i<permutations; i++)
{
int total = 0;
int weight = 0;
for (int j = 0; j<size; j++)
{
//jeżeli bit "not included" to omin"
if(((i>>j)&1)!=1)
continue;
total += Items[j].v;
weight += Items[j].w;
}
if (weight <= Capacity && total>bestValue)
{
bestPosition = i;
bestValue = total;
}
}
var include = new List<Item>();
for (int j = 0; j<size; j++)
{
// jeżeli bit pasuje, wtedy dodaj
if (((bestPosition>>j) & 1)==1)
include.Add(Items[j]);
}
return new Data { BestValue = bestValue, Include = include };
}//End of Run
}
}
在 main 中调用
var ks = new BruteForce
{
Capacity = MaxWeight,
Items = items.ToArray()
};
Data result = ks.Run();
Item 类只是一个简单的对象,包含值、重量和 ID
【问题讨论】:
-
看起来您的问题更适合 Code Review 网站,因为它正在工作并且您没有遇到错误。
-
this:
((i >> j) & 1) != 1与之前的评论完全一致:它将检查i中的jth(从0 开始)位是否已设置(或者更好的是未设置在在这种情况下) - 它将删除i中的最后一个j位,方法是将它们移出,然后按位和&与..000001一起移动,看看这是否是1跨度> -
我可以补充一点,它是二进制计数器技术来生成所有组合,所以我们必须使用这种按位运算
-
@AndyKorneyev 我不认为 Code Review 接受“向我解释这个别人写的代码”的问题。更多的是关于“我写了这个。我怎样才能让它变得更好?”。
标签: c# algorithm brute-force knapsack-problem