这里我有两个函数用于递归背包问题,而背包()给出了正确的输出(即220)但是knapsack1()给出了错误的值(即60)。任何人都可以解释为什么?
#include<iostream>
#include<stdio.h>
using namespace std;
long knapsack1(long w,long wt[],long val[],long n)
{
if(n==0||w==0)
{
return 0;
}
if (wt[n] > w)
{
n--;
}
else
{
return max(knapsack1(w,wt,val,n-1),val[n]+knapsack1(w-wt[n],wt,val,n-1));
}
}
long knapsack(long w,long wt[],long val[],long n)
{
if(n==0||w==0)
{
return 0;
}
if (wt[n] > w)
{
return knapsack(w, wt, val, n-1);
}
else
{
return max(knapsack(w,wt,val,n-1),val[n]+knapsack(w-wt[n],wt,val,n-1));
}
}
int main()
{
long val[] = {60, 100, 120};
long wt[] = {10, 20, 30};
long w = 50;
long n = sizeof(val)/sizeof(val[0]);
printf("%d", knapsack(w, wt, val, n));
printf("%d", knapsack1(w, wt, val, n));
return 0;
}
答案 0 :(得分:1)
尝试在启用警告的情况下对其进行编译... if
中的knapsack1
- 分支未返回值,并且行为未定义。