c++ - 修改后的 KnapSack 运行时错误

标签 c++ runtime-error knapsack-problem

我在解决 codechef 上的程序时遇到了一个问题,它是背包问题的修改版本.. 1.在这里我必须找到所有可能重量的最大成本..1<=n<=W 2.我已经使用标准DP算法解决了它......但是每次我提交我的代码......我都会遇到运行时错误...... 请看看我的代码..

   #include<bits/stdc++.h>
   using namespace std;
   #define  ll long long
   ll _max(ll a,ll b){return a>b?a:b;}
   ll sol[200009];
   void knapsack(ll W,ll val[],ll wt[],ll n,ll sol[])
   {
      ll i,w;
      ll K[n+1][W+1];


         for(ll i=0;i<=n;i++)
         {
              for(ll w=0;w<=W;w++)
              {
                if(i==0 || w==0)
                K[i][w]=0;
                else
                {
                   if(wt[i-1]<=w)
                   K[i][w]=max(val[i-1]+K[i-1][w-wt[i-1]],K[i-1][w]);
                   else
                   K[i][w]=K[i-1][w];
                }
              }
         }
         for(int j=0;j<W;j++)
         {
             sol[j]=K[n][j+1];
             printf("%lld ",sol[j]);
         }

    }

    int main()
    {
        ll n;
        scanf("%lld",&n);
        ll val[n];
        ll wt[n];

        ll sum =0;
        for(ll i=0;i<n;i++)
        {
           scanf("%lld",&wt[i]);
           scanf("%lld",&val[i]);
           sum+=wt[i];
        }

        knapsack(sum, val, wt, n,sol);
        return 0;
    }

最佳答案

好吧,我不保证这会给你一个 AC

您在编写解决方案时忽略了约束

3 ≤ N ≤ 100000;

1 ≤ W ≤ 2, for each item;

1 ≤ C ≤ 109, for each item.

你的矩阵

long long  K[n+1][W+1];

不会分配,因为n的最大值是100000,

W = sum = weight[i] * n 可以高达2*100000

相当于分配 K[100000][200000] 会产生运行时错误

关于c++ - 修改后的 KnapSack 运行时错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24568235/

相关文章:

c++ - 如何在 Qt Designer 中使小部件自动拉伸(stretch)到父小部件的大小

android.util.AndroidRuntimeException : You cannot combine swipe dismissal and the action bar

c++ - 特定的 c++ 指针/引用错误?

java - 最小化捆绑更新的成本(反向背包?)

javascript - 检测 div 网格中的间隙

c++ - 如何在 QListWidget 中为 QStringList 的每个项目显示一个 QLabel 和另一个 QString?

c++ - 优化可变长度编码

c++ - CPP:对空 vector size()输出的算术运算,给出不确定的行为

ruby - 救援 Rake 中的运行时错误

algorithm - 将列表分成两部分,它们的总和彼此最接近