您的位置:首页 > 其它

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];

:

[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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: