牛客小白月赛88D

paper_Z / 2024-03-11 / 原文

不是很裸的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;
}