01背包问题的递归法求解
int GetMaxScore(int h, int w[], int s[], int CourseCount)
{
if (CourseCount == 0 )
{
return 0;
}
else {
int Score1 = GetMaxScore(h, w, s, CourseCount - 1);
int Score2 = GetMaxScore(h - w[CourseCount-1], w, s, CourseCount - 1) + s[CourseCount-1];
//注意第n节课的数组下标为n-1!!!
if (h < w[CourseCount - 1])
{
return Score1;
}
else {
return Score1 > Score2 ? Score1 : Score2;
}
}
}
精髓在于理解动态变化过程:
设 为总时间h,考虑前n节课时可获得的最高分,则:
一、若第n节课时时间不够,即 ,则
二、若时间足够:
1)不选这门课,则分数为
2) 选这门课,则分数为
( 注意数组下标与课程序号差1)
main函数:
#include <stdio.h>
int main(void)
{
int CourseCount = 0;
int TotalTime = 0;
int EachTime[10] = { 0 };
int Score[10] = { 0 };
//Importing Data
scanf("%d", &TotalTime);
scanf("%d", &CourseCount);
for (int i = 0; i < CourseCount; i++)
{
scanf("%d", &EachTime[i]);
}
for (int i = 0; i < CourseCount; i++)
{
scanf("%d", &Score[i]);
}
//Output
printf("%d", GetMaxScore(TotalTime, EachTime, Score, CourseCount));
return 0;
}
因为正在学习递归故如此求解
也可尝试dp的方式