蛮力背包的C 一部分
C++ Part of brute-force knapsack
阅读器,好吧,我想我只是脑力了。我正在实施背包,我想到了我以1或2次实现了蛮力算法。所以我决定再做一个。这就是我陷入的。
让我们确定W是最大的重量,W(min)是我们可以将其放入k=W/w(min)
次的背包中的最小加权元素。我之所以解释这一点,是因为您,读者,最好知道为什么我需要问我的问题。
现在。如果我们想象我们有三种类型的东西可以放在背包中,而我们的背包可以存储像15个质量的单位,那么让我们分别将每个单位重量视为其数字。因此,我们可以将15件类型的15件事或第二类类型的7件类型的东西放在。但是,诸如22222221[7ed]
和12222222[7ed]
之类的组合对我们来说也是如此。计算它们是浪费我们为决定支付的任何类型的资源。(这是个玩笑,因为如果我们有更便宜的算法,那么BF是浪费,但我非常感兴趣)
我猜想,我们需要进行所有可能组合的选择类型被称为"与重复"的组合。C'(n,k)
的数量为(n+k-1)!/(n-1)!k!
。(当我输入消息时,我只是发现了我的理论中的一个洞。我们可能需要添加一个空的,零加权的零定价物品来容纳可用空间
所以,怎么了。
https://rosettacode.org/wiki/combinations_with_repetitions
由于此问题在此处被很好地描述了^我真的不想以这种方式使用堆栈,所以我想在单个周期中生成变化,该变化正在 from i=0 to i<C'(n,k)
。
所以,如果我能做到,它是如何工作的?我们有
int prices[n]; //appear mystically
int weights[n]; // same as previous and I guess we place (0,0) in both of them.
int W, k; // W initialized by our lord and savior
k = W/min(weights);
int road[k], finalroad[k]; //all 0
int curP = curW = maxP = maxW = 0;
for (int i = 0; i < rCombNumber(n, k); i ++) {
/*guys please help me to know how to generate this mask which is consists of indices from 0 to n (meaning of each element) and k is size of mask.*/
curW = 0;
for (int j = 0; j < k; j ++)
curW += weights[road[j]];
if (curW < W) {
curP = 0;
for (int l = 0; l < k; l ++)
curP += prices[road[l]];
if (curP > maxP) {
maxP = curP;
maxW = curW;
finalroad = road;
}
}
}
蒙版,道路 - 是一系列索引,每个索引可以等于0至n;并且必须从{0、1、2,...,...,n}中以每种选择中的k元素(与订单不重要的重复结合使用)
就是这样。证明我错了或帮助我。非常感谢 _
是的,算法当然会花很多时间,但是看起来应该有效。我对此很有趣。
更新:
我想念什么?
http://pastexen.com/code.php?file= emcn3f9cec.txt
答案是由Minoru提供的https://gist.github.com/minoru/745a7c19c7777777777777770232cf4bd3f3f80f9e,仅递增第一个元素就足够了,然后我们计算所有运载物,将我们进行携带和计数重置值作为重置和重置的元素的最大元素。
。这是我的代码:
#include <iostream>
using namespace std;
static long FactNaive(int n)
{
long r = 1;
for (int i = 2; i <= n; ++i)
r *= i;
return r;
}
static long long CrNK (long n, long k)
{
long long u, l;
u = FactNaive(n+k-1);
l = FactNaive(k)*FactNaive(n-1);
return u/l;
}
int main()
{
int numberOFchoices=7,kountOfElementsInCombination=4;
int arrayOfSingleCombination[kountOfElementsInCombination] = {0,0,0,0};
int leftmostResetPos = kountOfElementsInCombination;
int resetValue=1;
for (long long iterationCounter = 0; iterationCounter<CrNK(numberOFchoices,kountOfElementsInCombination); iterationCounter++)
{
leftmostResetPos = kountOfElementsInCombination;
if (iterationCounter!=0)
{
arrayOfSingleCombination[kountOfElementsInCombination-1]++;
for (int anotherIterationCounter=kountOfElementsInCombination-1; anotherIterationCounter>0; anotherIterationCounter--)
{
if(arrayOfSingleCombination[anotherIterationCounter]==numberOFchoices)
{
leftmostResetPos = anotherIterationCounter;
arrayOfSingleCombination[anotherIterationCounter-1]++;
}
}
}
if (leftmostResetPos != kountOfElementsInCombination)
{
resetValue = 1;
for (int j = 0; j < leftmostResetPos; j++)
{
if (arrayOfSingleCombination[j] > resetValue)
{
resetValue = arrayOfSingleCombination[j];
}
}
for (int j = leftmostResetPos; j != kountOfElementsInCombination; j++)
{
arrayOfSingleCombination[j] = resetValue;
}
}
for (int j = 0; j<kountOfElementsInCombination; j++)
{
cout<<arrayOfSingleCombination[j]<<" ";
}
cout<<"n";
}
return 0;
}
非常感谢,Minoru
- 0-1背包代码中的错误.我的代码中有什么错误
- C++:如何使函数只返回作为列表一部分的字符串
- std::sort()函数无法对向量的一部分进行排序
- 将类型声明为类型模板参数的模板参数的一部分是否合法?
- 分数背包边缘箱
- 反转整数的一部分(一半)的函数
- 具有多种约束(例如重量、体积等)的背包
- 选择基于另一个垫子的非零像素的cv::Mat的一部分?
- C 指针和对象作为不同类的一部分
- 如何分析代码的哪一部分创建了线程?
- 背包问题,视觉工作室问题
- 如何使用接口指针调用方法,该指针是其具体类的一部分,而不是接口的一部分
- 复制矩阵的一部分并粘贴到另一个矩阵C++上
- 分段故障背包问题
- 我可以将c ++清理器仅应用于程序的一部分而不是第三方库吗?
- C++向量的哪一部分在传递给函数时被复制
- C++结构的一部分
- 在 MPI 中共享数组的一部分
- 如何检测文件夹是否太重,如果是,请删除其中的一部分
- 蛮力背包的C 一部分