不是很裸的01背包但是被卡了半天,所以记一下思路(?)
对环的计算一般是从0-n-1,这样子转完一圈%n原位置就还是0,方便计算。
然后二维dp,第一维表示第几次,第二维表示多少度。
#include <iostream>
using namespace std;
int n, m;
int a[5010];
int f[5010][5010];
int main() {
cin >> n >> m;
for (int i = 1; i <= m; i++) {
cin >> a[i];
}
f[0][0] = 1; //初始位置设为1
for (int i = 1; i <= m; i++) {
for (int j = 0; j <= n; j++) {
f[i][j] = f[i - 1][(j + a[i]) % n] || f[i - 1][((j - a[i]) % n + n) % n]; //上一次 j+a[i] ,那么这一次就是逆时针旋转。要是走过了就是1,没走过就是0
}
}
if (f[m][0]) cout << "YES";
else cout << "NO";
return 0;
}