为什么我尝试解决UVA 624的代码没有给出正确的输出?

时间:2019-05-29 07:30:53

标签: c++ algorithm backtracking

我正在尝试通过回溯来解决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;
}

1 个答案:

答案 0 :(得分:0)

我自己修复了错误。错误出在主要功能上。 当您使用k = 0调用回溯函数时,回溯函数使k = 1并继续。因此,a [0]从不改变。

因此,解决方案是简单地以k = -1调用回溯。