这道问题起源洛谷
我用动态规划来写,solve(i,j)表示第 i 次调音调到 j 可不可行,true代表可行,false代表不可行
那么i>1时,solve(i,j)=true当且仅当 0<=j - a[j]<=maxlevel && solve(i - 1, j - a[j]) == true
或 0<=j +a[j]<=maxlevel && solve(i - 1, j +a[j]) == true
以下是我用这个思路写的代码
#include<iostream>
using namespace std;
int n, bl, ml;
int a[51];
bool in(int n) {
if (n >= 0 && n <= ml) {
return true;
}
else {
return false;
}
}
bool solve(int i, int j) {
if (i == 0) {
if (j == bl) {
return true;
}
else {
return false;
}
}
else{
if (in(j - a[j]) == true && (solve(i - 1, j - a[j]) == true)) {
return true;
}
else if (in(j + a[j]) == true && (solve(i - 1, j + a[j]) == true)) {
return true;
}
else {
return false;
}
}
}
int main() {
cin >> n >> bl >> ml;
for (int i = 1;i <= n;i++) {
cin >> a[i];
}
for (int j = ml;j >= -1;j--) {
bool ans2 = solve(n, j);
if (ans2 == true) {
cout << j;
break;
}
if (j == -1) {
cout << -1;
}
}
}
但是程序好像有bug,输入样例不对
请问bug在哪儿?