蓝桥杯砝码称重问题,到arr[j]=t就出问题了为什么


int n,j, w[100],arr[100];
bool prr[100];
int jueduizhi(int x, int y)
{
    if (x >= y) return (x - y);
    if (x < y) return (y - x);
}
void dfs(int x, int y)
{
    int t = jueduizhi(x, y);
    
    if (!prr[t])
    {
        arr[j] = t;
        j++;
        prr[t] = 1;
    }
    for (int i = 1; i <= n; i++)
    {
        dfs(x + w[i], y);
        dfs(x, y + w[i]);
    }
}
int main()
{
    cin >> n;
    for (int i = 1; i <= n; i++)
    {
        cin >> w[i];
    }
    dfs(0, 0);
    cout << j << endl;
    return 0;
}

参考GPT和自己的思路:

在这段代码中,当使用递归函数dfs进行搜索时,arr[j]=t的赋值操作会在不同的递归层次上进行,这可能导致出现重复的元素。因此,可以通过在dfs函数中添加一个bool型数组prr来避免这种情况的发生。当通过jueduizhi函数获得t值,如果prr[t]等于0,则可以将t添加到arr数组中,并将prr[t]设置为1,以表示t已经被添加到了arr数组中。这样做可以避免重复添加相同的元素,确保最终结果的正确性。

j未赋初值0