Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/58.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_Recursion_Knapsack Problem - Fatal编程技术网

C 打印背包解决方案的值

C 打印背包解决方案的值,c,recursion,knapsack-problem,C,Recursion,Knapsack Problem,对于背包问题,我有以下解决方案:(wt[]是权重数组,val[]是值数组,n是数组大小,index是我们正在尝试的当前项(用于递归),arr是表示天气的数组,或者解决方案中是否包含了项I int knapSack(int W, int wt[], int val[], int n, int index, int arr[]) { if (n == index || W == 0) return 0; if (wt[index] > W) return

对于背包问题,我有以下解决方案:(wt[]是权重数组,val[]是值数组,n是数组大小,index是我们正在尝试的当前项(用于递归),arr是表示天气的数组,或者解决方案中是否包含了项I

int knapSack(int W, int wt[], int val[], int n, int index, int arr[])
{
   if (n == index || W == 0)
       return 0;
   if (wt[index] > W)
       return knapSack(W, wt, val, n, index+1 );

   int with=val[index]+knapSack(W-wt[index], wt, val, n, index+1);
   int without=knapSack(W, wt, val, n, index+1);

   if(with>without){
       arr[index]=1;
       return with;
   }
   else{
       arr[index]=0;
       return without;
   }

}
在这个递归解决方案中,我试图通过将数组(res)中所取项目的索引设置为1来打印所选项目。
据我所知,如果
with>with>without
,这意味着我正在选择当前项目或项目#索引。那么为什么这没有返回正确的值呢?
我使用递归算法是有原因的,我知道在这里使用记忆版本会更容易。 示例:
体重:5677011
数值:2 4 5 6 9
W=25

将返回数组res中的5个1。当解决方案为18时,项为2、3、5(从索引1开始)。

前提1:在您的代码中,对
背包的递归调用没有传递
arr
,这应该会导致编译错误,我假设这只是一个复制/粘贴错误

前提2:根据您提出的数据,生成的
arr
值并非如您所示的全部
1
,而是
01011
,这仍然是不正确的

考虑这样一种假设情况:在函数执行过程中,带
大于不带
:在带
计算过程中,
arr
填充了正确的值;但随后开始不带
计算,这将覆盖
arr

由于带
大于不带
,因此返回的
arr
将是错误的,这就是问题的原因

一个简单的修复方法是复制
通过计算返回的
arr
,这样它就不会被
在不进行计算的情况下覆盖,例如:

int with=val[index]+knapSack(W-wt[index], wt, val, n, index+1, arr);

// copy the "with" arr
int arrWith[n];
copyArr(arr, arrWith, n);

int without=knapSack(W, wt, val, n, index+1, arr);

if(with>without){
    // restore the "with" arr
    copyArr(arrWith, arr, n);

    arr[index]=1;
    return with;
}
else{
    arr[index]=0;
    return without;
}
copyArr
只是:

void copyArr(int arr[], int arrDest[], int n) {
    int i;
    for(i = 0; i < n; i++) {
        arrDest[i] = arr[i];
    }
}
void copyArr(int-arr[],int-arrDest[],int-n){
int i;
对于(i=0;i

使用此修复程序,
arr
的结果值正确
01101

代码的其余部分在哪里?当您在调试器中遍历它时,您看到了什么?所有函数参数代表什么?此代码甚至不编译。