- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
#include <iostream>
#include <fstream>
#include <vector>
#include <map>
#include <string>
using namespace std;
int main () {
string line;
int weightCapacity;
int numItems;
double weight, value;
map<double,int> set;
vector<int> w;
vector<int> v;
vector<int> knapsack;
int bestValue = 0;
int subsetValue = 0;
int subsetWeight = 0;
int i;
vector<int> items;
ifstream myFile ("knapsack.txt");
// reading a text file
if (myFile.is_open()) {
cout << "Open" << endl;
}
else cout << "Unable to open file";
myFile >> weightCapacity;
myFile >> numItems;
cout << weightCapacity << endl;
cout << numItems << endl;
for (i = 0; i < numItems; i++) {
myFile >> weight;
myFile >> value;
set[value/weight] = i;
w.push_back(weight);
v.push_back(value);
cout << weight << " " << value << endl;
}
int currentW = weightCapacity;
int totalValue = 0;
for (auto iter = set.rbegin(); iter != set.rend(); ++iter) {
cout << iter->first << ": " << iter->second << endl;
int W = w.at(iter->second);
if (W <= currentW) {
items.push_back(iter->second);
totalValue += v.at(iter->second);
currentW = currentW - W;
}
}
cout << totalValue << endl;
for(i=0; i < items.size(); i++) {
cout << items.at(i) << ' ';
}
输入文件:
最佳答案
我对您的解决方案有几点看法。
map
其中“key”是value per weight
的比率而“值”是 item's id
(项目在原始订单中的位置)。那么,如果两个项目具有相同的 value per weight
呢? ?在这种情况下, map 将只保留稍后出现的 map 。这可能会损坏您的解决方案。 Algorithm 2
在您的帖子中建议您需要按 item.value / item.weight
的降序对 (i) 进行排序(ii) 在平局的情况下,按 item.value
的降序排列.您在解决方案中没有考虑 (ii)。 #include <iostream>
#include <fstream>
#include <vector>
#include <map>
#include <string>
#include <algorithm>
using namespace std;
#define myFile myFile
bool comp(const pair<double, pair<int, int>> &i1, pair<double, pair<int, int>> &i2) {
if(i1.first == i2.first) return (i1.second.second > i2.second.second);
return (i1.first > i2.first);
}
int main () {
string line;
int weightCapacity;
int numItems;
// double weight, value;
int weight, value;
map<double,int> set;
vector<int> w;
vector<int> v;
vector<int> knapsack;
int bestValue = 0;
int subsetValue = 0;
int subsetWeight = 0;
int i;
vector<int> items;
vector<pair<double, pair<int, int>>> wv_ratio;
ifstream myFile ("Heur0.txt");
// reading a text file
if (myFile.is_open()) {
cout << "Open" << endl;
}
else cout << "Unable to open file";
myFile >> weightCapacity;
myFile >> numItems;
// cout << weightCapacity << endl;
// cout << numItems << endl;
for (i = 0; i < numItems; i++) {
myFile >> weight;
myFile >> value;
//set[value/weight] = i;
wv_ratio.push_back(make_pair((value/(double) weight), make_pair(i, value)));
w.push_back(weight);
v.push_back(value);
//cout << weight << " " << value << endl;
}
sort(wv_ratio.begin(), wv_ratio.end(), comp);
int currentW = weightCapacity;
int totalValue = 0;
//for (auto iter = set.rbegin(); iter != set.rend(); ++iter) {
for (auto tmp = wv_ratio.begin(); tmp != wv_ratio.end(); ++tmp) {
pair<double, pair<int, int>> iter = (pair<double, pair<int, int>>) *(tmp);
//cout << iter->first << ": " << iter->second << endl;
cout << iter.second.first << ": " << iter.first << " " << iter.second.second << endl;
int W = w.at(iter.second.first);
if (W <= currentW) {
items.push_back(iter.second.first);
totalValue += v.at(iter.second.first);
currentW = currentW - W;
}
}
cout << totalValue << endl;
for(i=0; i < items.size(); i++) {
cout << items.at(i) << ' ';
}
return 0;
}
它产生这样的输出:
2889
782 585 765 741 628 862 618 727 770 394 386 71 535 844 941 789 610 874 777 412 771 319 358 391 607 276 235 223 329 216 790 747 631 700 541 842 229 878 344
显然它与您的预期不匹配。但是,我很确定我在这里分享的代码是根据
Algorithm 2
工作的。你的帖子。如果您认为您的预期输出绝对正确并且可以通过遵循
Algorithm 2
来实现,我建议您使用较小尺寸的输入进行调试。 .
关于c++ - 背包贪婪算法-我做错了什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66082947/
我已经用 Scala 中的每一项编写了有界背包问题的答案,并尝试将其转换为 Haskell,结果如下: knapsack :: [ ( Int, Int ) ] -> [ ( Int, Int ) ]
我正在解决这个动态编程问题,并且我一直坚持用 Java 编写迭代解决方案 目标是找到花费 X 美分所需的最少卡路里数。如果我们不能恰好花费 X 美分,那么就没有解决方案。我们给定了 N 个元素,每个元
根据维基百科和我浏览过的其他资源,您需要矩阵m[n][W]; n - 元素数量和 W - 背包的总容量。这个矩阵变得非常大,有时大到无法在 C 程序中处理。我知道动态规划的基础是节省内存时间,但是,有
我发现此代码使用蛮力机制解决背包问题(这主要是为了学习,因此无需指出动态更有效)。我得到了可以工作的代码,并且了解了大部分代码。最多。这是问题: 我注意到这两个条件,我不知道它们如何工作以及为什么在代
我必须实现背包问题的以下变体。背包中的每件元素都有优先级和重量。现在我指定一个权重 X。我必须知道计算权重总和至少为 X 并且具有最低优先级的最小项目集。每个项目只能选择一次。示例: Knap
所以我想知道如何计算背包问题的所有解。也就是说,我有兴趣从一组最大大小为 K 的数字中找出可能的子集数。 例如,我们有一组大小为 {3, 2, 5, 6, 7} 的项目,最大大小为 K = 13。因此
我在执行任务时遇到了问题。我有一个数据库,其中包含所有具有“价格”值的项目。它们连接到不同的“轮次”,“轮次”有一个“总值(value)”,其中这些项目“价格”-值(value)全部放在一起定义了“总
我遇到的问题如下: 给定一个包含 N 个元素的队列,每个元素都有一个重量,以及一个包含 K 个容器的队列。我们需要按照元素来的顺序将元素分成容器。例如,第一个项目只能进入第一个容器,第二个可以进入第一
问题如下: You have n trip lengths in km which should be divided among m number of days such that the max
我昨晚在开发一个应用程序时遇到了一个特定的问题,我确信它可能有一个有效的算法来解决它。谁能推荐一下? 问题: TL;DR:也许图片会有所帮助:http://www.custom-foam-insert
如何获取下拉列表,其中占位符显示“选择类别”作为默认选择? 以下代码没有渲染占位符 $this->crud->addField([ // Select2 'label'
刚刚带背包的新品。我在官方网站上搜索并用谷歌搜索,但没有找到答案 在 laravel 7 中,使用 Backpack 4.1 我的数据模型是:客户有很多地址 关系在客户模型中配置: public fu
据我所知(如果我错了请纠正我),背包只处理 $fillable 字段。整个 laravel 的事情不就是 $fillable 和 $guarded 之间的分离吗? MWE: 在 User.php 中:
看到this之后讲座我创建了以下背包代码。在讲座中,教授说从最优值(19:00 分钟)确定集合很容易,但我找不到如何去做。我在代码中提供了一个将值相加为 21 的示例,我如何根据该值确定集合(在本例中
为什么贪心法适用于连续背包问题而不适用于 0-1 背包问题? 最佳答案 对于连续背包,在最佳解决方案中,您不能有 q > 0 的每单位成本为 c 的元素,同时留下 q' > 0 成本为 c' > c
我在理解动态规划时遇到了一些困难,尽管我已经通读了很多资源试图理解。 我理解使用斐波那契算法给出的动态规划示例。我明白如果你使用分而治之的方法,你最终会多次解决一些子问题,而动态编程通过解决这些重叠的
假设一个经典的 0-1 背包问题,但您可以上溢/下溢背包并受到一些惩罚。每单位溢出(重量超过最大容量)扣除X利润,每单位下溢(重量低于最大容量)扣除Y利润。 我想按利润与重量的比率对所有元素进行排序,
我正在编写具有多个约束的背包 0-1 的变体。除了重量限制外,我还有数量限制,但在这种情况下,我想解决背包问题,因为我的背包中需要恰好有 n 件元素,重量小于或等于 W。我我目前正在为基于 Roset
给定一个无限正整数数组或一个正整数流,找出总和为 20 的前五个数。 通过阅读问题陈述,它首先似乎是 0-1 Knapsack 问题,但我很困惑 0-1 Knapsack algo 可以在流上使用的整
我想解决一个3维背包问题。 我有许多不同宽度、高度、长度和值(value)的盒子。我有一个指定的空间,我想把盒子放在那个空间里,这样我就能获得最优的利润。我想使用暴力来做到这一点。 我正在用 Java
我是一名优秀的程序员,十分优秀!