C++ 仅带重量的背包
如果我给出了最大重量,比如w=20,我给出了一组重量,比如m=[5,7,12,18],那么我怎么能用m来计算最大重量中可能存在的最大重量呢。在这种情况下,答案是19。加上12+7=19。我的密码是18,请帮我C++ 仅带重量的背包,c++,algorithm,C++,Algorithm,如果我给出了最大重量,比如w=20,我给出了一组重量,比如m=[5,7,12,18],那么我怎么能用m来计算最大重量中可能存在的最大重量呢。在这种情况下,答案是19。加上12+7=19。我的密码是18,请帮我 int weight(int W, vector<int> &m) { int current_weight = 0; int temp; for (int i = 0; i < w.size(); i++) { for (int j =
int weight(int W, vector<int> &m) {
int current_weight = 0;
int temp;
for (int i = 0; i < w.size(); i++) {
for (int j = i + 1; j < m.size(); j++) {
if (m[i] < m[j]) {
temp = m[j];
m[j] = m[i];
m[i] = temp;
}
}
}
for (size_t i = 0; i < m.size(); ++i) {
if (current_weight + m[i] <= W) {
current_weight += m[i];
}
}
return current_weight;
}
intweight(intw,vector&m){
int当前_权重=0;
内部温度;
对于(int i=0;i if(当前重量+m[i]您描述的问题看起来更像是问题的一个版本。基本上,您的实现一开始就没有问题;显然您已经正确地实现了问题的贪婪算法。也就是说,该算法无法为每个输入生成最优解。您找到的实例是such是一个例子
然而,可以使用另一种称为的方法来解决问题,这种方法可以看作是解决方案递归公式的组织形式
设m={m_1,…m_n}
为正项目大小的集合,W
为容量约束,其中n
为正整数。将数组a[n][W]
组织为状态空间,其中
A[i][j] = the maximum weight at most j attainable for the set of items
with indices from 0 to i if such a solution exists and
minus infinity otherwise
对于{1,…,n}
中的每一个i和{1,…,W}
中的每一个j;为了便于表示,假设A
在其他任何地方都有一个负无穷大的值。注意,对于每一个这样的i
和j
的递归关系
A[i][j] = min { A[i-1][W-m_j] + m_j, A[i-1][W] }
保持,其中第一种情况对应于在解决方案中选择项i
,第二种情况对应于不在解决方案中选择项i
接下来,组织一个循环,以i
和j
的递增顺序填充此表,其中i=1的初始化必须在之前完成。填充状态空间后,最后一列中的最大可行值
max{ A[n][j] : j in {1,...,W}, A[n][j] is not minus infinity }
产生最佳解决方案。如果还需要相关的项目集,则必须使用一些回溯或适当的辅助数据结构。因此,通过将权重数组的副本作为值数组传递,该解决方案似乎对通常存在的解决方案是一个微不足道的更改。您使用的是贪婪算法,但它不适合这个问题。寻找DP解决方案你能解释你在说什么吗解决这个问题你至少应该知道动态规划的存在。例如,看看我不能理解你代码的最大部分,如果可能的话,你能写一个伪代码吗nd是指在优化的最后阶段无法获得实际的最佳解;如果填写表格,则必须获得最大可行解(即不等于初始值减去无穷大)。