a数组的元素无论加减b元素,a的原数不变,先对a数组求和 再从b中挑取0-n个元素即可。

为什么开205的数组?因为b中几个数的算术和可能为负,即所有算术和在(-100,100)范围。

#include <bits stdc++.h>
using namespace std;
typedef long long ll;
bool dp[205], ex[205];
int main()
{
    int i, j, n, y, a, b, sum;
    cin &gt;&gt; n &gt;&gt; y;
    for (i = sum = 0; i &lt; n; i++)
    {
        cin &gt;&gt; a;
        sum = (sum + a) % y;
    }
    dp[sum + 100] = true;
    while (n--)
    {
        for (i = 0; i &lt; 205; i++)
        {
            ex[i] = dp[i];
        }
        cin &gt;&gt; b;
        for (j = 0; j &lt; 205; j++)
        {
            if (ex[j])
            {
                dp[(j - 100 + b) % y + 100] = true;
                dp[(j - 100 - b) % y + 100] = true;
            }
        }
    }
    for (i = 204; i &gt;= 100; i--)
    {
        if (dp[i])
        {
            cout &lt;&lt; i - 100 &lt;&lt; endl;
            break;
        }
    }
    system("pause");
    return 0;
}