Light OJ 1125 Divisible Group Sums (DP)
2016-02-11 21:40
363 查看
题意:从n个数字中取出m个数字形成一个集合,问有多少个集合,集合中元素和为D的倍数。
解析:dp[i][j][k] 考虑前i个数字从中取出j个 mod D = k 的个数。
状态转移方程:dp[i][j][k] = dp[i-1][j][k]+dp[i-1][j-1][((k-a[i])%d+d)%d];
解析:dp[i][j][k] 考虑前i个数字从中取出j个 mod D = k 的个数。
状态转移方程:dp[i][j][k] = dp[i-1][j][k]+dp[i-1][j-1][((k-a[i])%d+d)%d];
: [code]#include<cstdio> #include<cstring> #include<cmath> #include<cstdlib> #include<algorithm> using namespace std; typedef long long LL; int n,q,m,d,a[205]; LL dp[205][20][20]; void solve(){ int i,j,k; dp[0][0][0] = 1; for(i = 1;i <= n;i++){ dp[i][0][0] = 1; for(j = 1;j <= i&&j <= m;j++){ for(k = 0;k < d;k++){ dp[i][j][k] = dp[i-1][j][k]+dp[i-1][j-1][((k-a[i])%d+d)%d]; } } } printf("%lld\n",dp [m][0]); } int main(){ int i,j,cas,T; scanf("%d",&cas); for(T = 1;T <= cas;T++){ scanf("%d%d",&n,&q); for(i = 1;i <= n;i++) scanf("%d",&a[i]); printf("Case %d:\n",T); while(q--){ scanf("%d%d",&d,&m); solve(); } } return 0; }
相关文章推荐
- Python图像处理库PIL的基本模块介绍
- 几个重要的shell命令:diff patch tar find grep
- BZOJ1858 序列操作 [treap,避免双标记的特殊技巧]
- 九度OJ 1102 最小面积子矩阵
- 第十一章编程练习(7)
- 老翟书摘:从《大野耐一的现场管理》看软件工程管理
- 动态规划入门之LCS(2)
- 第二十天
- 从DNS配置
- TQ2440,学习笔记之开发板介绍
- 017 QtCreator生成美观的可执行文件
- openssh
- 移动web开发框架研究
- 大数相乘
- css基本内容
- 232. Implement Queue using Stacks LeetCode
- 在WPF中的Canvas上实现控件的拖动、缩放
- 在WPF中的Canvas上实现控件的拖动、缩放
- Android问题集:1、在清单文件中设置activity全屏,报错了!!
- 动态规划-跑跑卡丁车