codeforces 577B B. Modulo Sum(背包+dp)
来源:互联网 发布:淘宝网韩都衣舍商城 编辑:程序博客网 时间:2024/05/17 01:21
参考
http://blog.csdn.net/loveyou11111111/article/details/48595091
和
http://blog.csdn.net/qq_24451605/article/details/48625131
定义状态dp[i][j]代表利用前i个数是否能够得到对m取模得j。
转移的过程采取背包的方法,很水
但是直接做一定会超时,O(n⋅m)
利用鸽巢定理可以知道,当n>m时,有n个数便有n个前缀和,而n%m只有m-1个值,所以至少有两个余数相同的前缀和,那么便能够得到一个连续的子序列满足题设条件,所以n>m的情况特判,复杂度就会优化为O(m⋅m)
题目大意:给出n个数,求是否存在一个子集,这个子集中的数的和能够整除m
#include <iostream>#include <cstring>#include <cstdio>#include <algorithm>#define MAX 1007using namespace std;int n,m;int a[MAX*MAX];int dp[MAX][MAX];int main ( ){ scanf ( "%d%d" , &n , &m ); for ( int i = 1 ; i <= n ; i++ ) scanf ( "%d" , &a[i] ); if ( n > m ) { puts ("YES" ); return 0; } memset ( dp , 0 , sizeof ( dp ) ); dp[0][0] = 1; bool flag = false; for ( int i = 1 ; i <= n ; i++ ) for ( int j = m-1; j >= 0; j-- ) { int x = ((j-a[i])%m+m)%m; if ( dp[i-1][x] ) { dp[i][j] = 1; if ( j == 0 ) flag = true;//flag是在这里变,因为表示至少有一个值选了 } if ( dp[i-1][j] ) dp[i][j] = 1; } if ( flag ) puts ("YES"); else puts ("NO"); }
#include <bits/stdc++.h> using namespace std; int dp[1010][1010], a[100010], n, m; int main() { scanf("%d%d",&n,&m); for (int i = 1; i <= n; i ++) { scanf("%d",&a[i]); a[i] %= m; } if (n > m) { printf("YES\n"); return 0; } for (int i = 0; i <= n; i ++) dp[i][0] = true; for (int i = 1; i <= n; i ++) for (int j = 0; j <= m; j ++) dp[i][j] = dp[i-1][j] || dp[i-1][(j + a[i]) % m]; printf("%s\n", dp[n][m] ? "YES" : "NO"); return 0; }
阅读全文
0 0
- codeforces 577B B. Modulo Sum(背包+dp)
- codeforces 577B B. Modulo Sum(背包+dp)
- Codeforces 577B Modulo Sum 【多重背包】
- codeforces 577B Modulo Sum(DP||set)
- codeforces 577B Modulo Sum
- codeforces 577B Modulo Sum
- codeforces 377B Modulo Sum(数学,dp)
- Codeforces Round #319 (Div. 2) 577B Modulo Sum(dp)
- Codeforces 577 B Modulo Sum 简单数学+dp
- [CodeForces 577B]Modulo Sum[实现][数学]
- codeforces #319 DIV2 577B Modulo Sum
- [杂题] Codeforces #577B. Modulo Sum
- Codeforces Round #319 (Div. 2) B Modulo Sum (背包)
- Codeforces Round #319 (Div. 2)B. Modulo Sum(数学,DP)
- cf B. Modulo Sum (01背包)
- codeforce 577 B. Modulo Sum
- Codeforces 577B Modulo Sum 鸽巢原理
- Codeforces 577B Modulo Sum 动态规划基础
- 如何更改Tomcat的JVM堆设置(- xms
- 小小Java面试题(一)
- 二级列表获取菜谱步骤
- Markdown常用命令
- 简易实现项目的频道管理
- codeforces 577B B. Modulo Sum(背包+dp)
- 欢迎使用CSDN-markdown编辑器
- 开发动态网站所需的构件
- 顺时针打印矩阵
- 理解Spark的核心RDD
- Vue生命周期详解
- JSP中EL表达式详解
- 函数指针的两种调用方式
- 编译linux内核加入 GPIO support 方法