C++11 递归0-1背包
这里我有两个函数用于递归背包问题,而背包()给出了正确的输出(即220),但背包1()给出了错误的值(即60)。有人能解释一下原因吗C++11 递归0-1背包,c++11,recursion,knapsack-problem,C++11,Recursion,Knapsack Problem,这里我有两个函数用于递归背包问题,而背包()给出了正确的输出(即220),但背包1()给出了错误的值(即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;
#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;
}
#包括
#包括
使用名称空间std;
长背包1(长w,长wt[],长val[],长n)
{
如果(n==0 | | w==0)
{
返回0;
}
如果(wt[n]>w)
{
n--;
}
其他的
{
返回最大值(背包1(w,wt,val,n-1),val[n]+背包1(w-wt[n],wt,val,n-1));
}
}
长背包(长w,长wt[],长val[],长n)
{
如果(n==0 | | w==0)
{
返回0;
}
如果(wt[n]>w)
{
返回背包(w、wt、val、n-1);
}
其他的
{
返回最大值(背包(w,wt,val,n-1),val[n]+背包(w-wt[n],wt,val,n-1));
}
}
int main()
{
长val[]={60100120};
长wt[]={10,20,30};
长w=50;
长n=sizeof(val)/sizeof(val[0]);
printf(“%d”,背包(w,wt,val,n));
printf(“%d”,背包1(w,wt,val,n));
返回0;
}
尝试在启用警告的情况下编译它。背包1
中的if
-分支未返回值,并且行为未定义。通过基本调试您学到了什么?您应该能够描述您的控件和/或数据流中有哪些未按预期运行。请看这个可爱的博客寻求帮助。