Codeforces Round #319 (Div. 2)——B. Modulo Sum(01背包)

来源:互联网 发布:今日头条刷评论软件 编辑:程序博客网 时间:2024/06/10 18:05

题意:

现在你有一个长度为n的数组,然后问你能否在这个数组中找一个非空的子序列,然后使得它们的和%m==0.

思路:

一开始想了想dfs,但是明显不可行,因为数据范围太大。 

但是又有什么可以找子序列呢?(非连续),于是类比到了01背包,用了dp。

但是还是挺巧妙的方法。

#include<stdio.h>#include<string.h>#include<iostream>#include<algorithm>using namespace std;#define maxn 1000100#define inf 99999999typedef __int64 ll;int dp[1010],tmp[1010];ll a[maxn];int main(){int n,m;scanf("%d%d",&n,&m);for(int i=1;i<=n;i++) scanf("%I64d",&a[i]);//这里定义tmp的作用是暂时保存当前和的真假性。//如果不临时存下来的话,会错,因为它会在这一回更改后面的值 for(int i=1;i<=n;i++){if(dp[0]) break;for(int j=0;j<m;j++){if(dp[j]){tmp[(j+a[i])%m]=1;}}tmp[a[i]%m]=1;for(int j=0;j<m;j++){dp[j]=tmp[j];}}if(dp[0]) printf("YES\n");else printf("NO\n");}/*4 51 1 1 1*/


0 0
原创粉丝点击