我的背包算法有问题。老实说,我不知道出了什么问题。当我使用一次程序时,所有的工作都是错误的,但当我在循环中使用我的程序(用于测试)时,我有很多问题。
我的函数哪里可能有问题:
void intoKnapsack(int k, float actual_profit, float actual_weight)
{
if (actual_weight + weight[k] <= cap)
{
tmp[k] = 1;
if (k <= number_items)
intoKnapsack(k + 1, actual_profit + value[k], actual_weight + weight[k]);
if (((actual_profit + value[k]) > final_profit) && (k == number_items))
{
final_profit = actual_profit + value[k];
final_weight = actual_weight + weight[k];
for (j = 0; j <= k; j++)
knap[j] = tmp[j];
}
}
else if ((bound(actual_profit, actual_weight, k) >= final_profit))
{
tmp[k] = 0;
if (k <= number_items)
intoKnapsack(k + 1, actual_profit, actual_weight);
if ((actual_profit > final_profit) && (k == number_items))
{
final_profit = actual_profit;
final_weight = actual_weight;
for (j = 0; j <= k; j++)
knap[j] = tmp[j];
}
}
}
有人能帮我解决问题吗?
好的,所以当我只准备一次相同的N(就像上面的例子中的100)时,它工作得很好,但是当我在循环中做它时:
srand((unsigned int) time(NULL));
algorytm a;
fstream wynik;
wynik.open("result.txt",ios::out | ios::app);
for(int i=0; i<how_test; i++){ //how many tests
write(how_n); //how many n in my file, and create file
a.read() //read from file (n, and weight / val)
time_start();
a.sort(); //I sort it
a.intoKnapsack(0, 0.0, 0.0); //my function above, so I give here a 3x to do it properly over and over in loop
get_time(); //stop time
measurement+=get_time();
result<<get_time()<<" s."<<endl; //just for
}
所以当我自己写(50)的时候,然后在同一个程序中写(51)等等,效果很好,但是当我写(50)的时候,然后另一个写(50)的时候,然后我有错误的算法。
也许当我做排序的时候,在清除背包之前,它在另一个循环中不起作用,但另一方面,我首先需要做排序。
有我的排序函数
void algorytm::sort() {
int a;
int b;
float c;
for (i = 0; i < number_items; i++)
factor[i] = (float) val[i] / (float) weight[i]; //to sort from best to worst
for (i = 0; i < number_items - 1; i++) {
for (j = i + 1; j < number_items; j++) {
if (factor[i] < factor[j]) {
c = factor[i]; //
factor[i] = factor[j];
factor[j] = c;
a = val[i]; //
val[i] = val[j];
val[j] = a;
b = weight[i]; //
weight[i] = weight[j];
weight[j] = b;
}
}
}
}
本文向大家介绍C中的0-1背包问题?,包括了C中的0-1背包问题?的使用技巧和注意事项,需要的朋友参考一下 背包是袋子。背包问题是根据物品的值将物品放入袋中的。目的是使袋子内的值最大化。在0-1背包中,您既可以放置物品也可以将其丢弃,没有将物品的某些部分放入背包的概念。 样本问题 重量分布 最大值为65,因此我们将项目2和3放入背包。 0-1背包问题计划 输出结果
在讲座中,我们已经考虑了背包问题:有n个项的正权值为w1,..、wn和值v1,..vn和容量为W的背包。问题的可行解是使总重量不超过W的物品的子集。目标是找到一个最大可能总价值的可行解。对于权值均为正整数的情形,我们讨论了求解时间为O(nW)的背包问题的动态规划解法。 a)假设所有项目的权值都是正整数,而不是权值。项目的权值可以是任意的正实数。描述一个解决背包问题的动态规划算法,如果所有项目的值都
给定问题: 0/1-背包问题,n个项目的权值为w_i和v_i。求权重加起来为权重W的项目的最大总价值。 但有两个难题: 背包中所有物品的总重量必须正好是w。 项目总量必须为偶数。 我想找到一个算法,同时关注这两个问题。我已经发现了如何一次性关注其中一个。 现在我的问题是如何实现这两个难题一起工作。有办法解决这个吗? (如果我的问题有什么不清楚的地方,尽管问!)
说明 调用方法1: $.f2eAct.myPackage(el,options); 函数说明: 奖品背包 参数说明: 参数名 类型 说明 备注 el string DOM元素对象 必要 act string 活动key 必要 showPage booleam 是否显示页码 默认不显示 pageId int 页面Id 无 pageSize int 每页显示数量 无 filter array 过滤
本文向大家介绍0/1背包在C ++中使用Branch and Bound,包括了0/1背包在C ++中使用Branch and Bound的使用技巧和注意事项,需要的朋友参考一下 想法是实现以下事实:贪婪方法为分数阶背包问题提供了最佳解决方案。 为了检查特定节点是否可以为我们提供更好的解决方案,我们计算(通过节点)实施贪婪方法的最佳解决方案。如果用Greedy方法计算出的解本身不是迄今为止最好的解
本文向大家介绍解决分数背包问题的C ++程序,包括了解决分数背包问题的C ++程序的使用技巧和注意事项,需要的朋友参考一下 在小背包问题中,给出了一组项目,每个项目都有一个权重和一个值。我们需要打破物品以最大化背包的总值,这可以通过贪婪的方法来完成。 算法 范例程式码 输出结果