Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/160.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 仅带重量的背包_C++_Algorithm - Fatal编程技术网

C++ 仅带重量的背包

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 =

如果我给出了最大重量,比如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 = 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;iif(当前重量+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是指在优化的最后阶段无法获得实际的最佳解;如果填写表格,则必须获得最大可行解(即不等于初始值减去无穷大)。