【牛客算法周周练2 】B Music Problem
传送门
思路:
我们不难想到,如果n>3600的话,无论物品的大小,我们肯定能够凑出3600的倍数来。所以问题就可以变成O(3600*3600)的一个暴力背包了。
题目大意:
给出N个数,问我们能否从中选出一些数字,使得其加和为3600的倍数。
#include<string>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<cstdio>
#include<set>
#include<vector>
#include<map>
#include<queue>
#define ll long long
using namespace std;
bool dp[3605][3605];
int a[150000];
int main(){
int T;
cin>>T;
while(T--)
{
memset(dp,false,sizeof(dp));
int n;
cin >> n;
for(int i=1;i<=n;i++)
{
cin>>a[i];
}
if(n>3600){
cout<<"YES\n";
}else{
for(int i=0;i<n;i++){
dp[i+1][a[i+1]%3600]=true;
for(int j=0;j<3600;j++){
if(dp[i][j]==true)
{
dp[i+1][j]=true;
dp[i+1][(j+a[i+1])%3600]=true;
}
}
}
if(dp[n][0]==true) cout<<"YES\n";
else cout<<"NO\n";
}
}
return 0;
}