微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

背包实现未正确填充试了调试好几天了还在学习

如何解决背包实现未正确填充试了调试好几天了还在学习

Visualiazation of code execution 当我将它加载到可视化工具中时,我的表格没有被正确填充这个背包问题变化的最小值究竟是什么错误?我意识到这似乎是一个懒惰的问题,但我已经花了几天时间,不知道出了什么问题。我还在学习。

#include<iostream> 
using namespace std;
void Minwater(int w[],int p[],int T,int n)/// Assumes n is last element of w[]
{
    int R[4][7];//Initialize array of n+1 row and T+1 cols
    for(int i = 0; i <= n+1; i++)
    {
        for(int j = 0; j <= T+1; j++)
        {
            if (i == 0 || j == 0)
                R[i][j] = 0;
            else if (w[i - 1] <= j)
                R[i][j] = min(p[i - 1] + R[i - 1][j - w[i - 1]],R[i - 1][j]);
            else
                R[i][i] = R[i - 1][j];
       
        }
      cout<< R[n][T];
    }
  
}

int main() {
  int w[3]={1,2,3};
  int T=6;
  int p[3]={10,15,40};
  Minwater(w,p,T,4);
  return 0;
}

该表假定取两个值中的最小值 min(p[i - 1] + R[i - 1][j - w[i - 1]],R[i - 1][j]) 但我似乎用全零填充它,并且整个表格最终都没有填充。

解决方法

首先,我认为我们不应该在 i - 1 时访问 i == 0,这会导致不必要的行为,因此最好设置 R[i][j] = 0 when i == 0

我也改为 max 因为如果你想使用 min 你应该将所有值设置为无穷大否则 0 将是整个网格中的默认值

还要确保您的网格 R 未初始化为某个值,以便最大操作可以是决定性的(我添加了 = {0} 只是为了表明我们希望所有都为零,您可能需要一个 for 循环来初始化所有其中)

#include<iostream> 
using namespace std;
void Minwater(int w[],int p[],int T,int n)/// Assumes n is last element of w[]
{
    int R[4][7] = {0};//Initialize array of n+1 row and T+1 cols
    for(int i = 0; i <= n; i++)
    {
        for(int j = 0; j <= T; j++)
        {
            if (i == 0)
                R[i][j] = 0;
            else if (w[i - 1] <= j)
                R[i][j] = max(p[i - 1] + R[i - 1][j - w[i - 1]],R[i - 1][j]);
            else
                R[i][i] = R[i - 1][j];
       
        }
      cout<< R[n][T];
    }
  
}

int main() {
  int w[3]={1,2,3};
  int T=6;
  int p[3]={10,15,40};
  Minwater(w,p,T,4);
  return 0;
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。