我正在尝试通过回溯来解决UVA 624。但是,我的代码给出了运行时错误,并且没有返回正确的输出。逻辑错误在哪里?
我已经尝试调试它,但是无法修复逻辑。
假定变量res和maxsum分别包含最佳向量和最佳向量和。 N,n和歌曲将存储输入。 向量“ a”保存解向量的当前状态。它应该由1和0组成,指示songs [i]是否是解决方案的一部分。 如果“ a”的大小等于n,则它可以是一个解决方案,并经过适当处理。
construct_candidates生成a的第k个位置的可能性。因此,如果包括歌曲“ k”之后的向量之和大于N,则a [k]可以假定的唯一可能值为false,否则可以为true或false。
#include <bits/stdc++.h>
using namespace std;
vector <int> res;
int maxsum = INT_MIN;
int N;
int n;
vector <int> songs;
bool is_a_soln(vector <int> &a, int k, int n)
{
return (k == n);
}
void construct_candidates(vector <int> &a, int k, int n, vector <int> &c)
{
int temp = 0;
for (int i = 0; i < n; i++)
{
if (a[i] == 1)
{
temp += songs[i];
}
}
if (temp + songs[k] <= N)
{
c.push_back(true);
c.push_back(false);
}
else c.push_back(false);
}
void backtrack (vector <int> &a, int k, int n)
{
vector <int> c;
// for (int i : a) cout << i << " ";
cout << endl;
if (is_a_soln(a,k,n))
{
int temp = 0;
for (int i = 0; i < n; i++)
{
if (a[i] == 1)
{
temp += songs[i];
}
}
if (temp > maxsum)
{
maxsum = temp;
res = a;
}
}
else
{
k++;
construct_candidates(a,k,n,c);
for (int i = 0; i < c.size(); i++)
{
a[k] = c[i];
backtrack(a,k,n);
}
}
}
int main()
{
cin >> N;
cin >> n;
vector <int> a(n, INT_MIN);
for (int i = 0; i < n; i++)
{
int o;
cin >> o;
songs.push_back(o);
}
backtrack(a,0,n);
cout << maxsum <<endl;
}
答案 0 :(得分:0)
我自己修复了错误。错误出在主要功能上。 当您使用k = 0调用回溯函数时,回溯函数使k = 1并继续。因此,a [0]从不改变。
因此,解决方案是简单地以k = -1调用回溯。