poj 1745 dp(一组数任意加减能否整除k)

来源:互联网 发布:php获取页面代码方法 编辑:程序博客网 时间:2024/04/25 23:08

题意:给出n个数,问在这n个数中任意添加+,-号,能否得出一个数整除k。

思路:动态规划。dp[i][j]表示前i个数的组合能否整除j。由于最后只需要知道dp[n-1][0](元素从0~n-1)的值,所以用递归形式的dp。

#include <stdio.h>#include <string.h>#define N 10005int n,k;int s[N],dp[N][205];int solve(int x,int m){    if(!x)        return m == s[0];    if(dp[x][m] != -1)        return dp[x][m];    if(solve(x-1,(m+s[x])%k) || solve(x-1,((m-s[x])%k+k)%k))        return dp[x][m] = 1;    return dp[x][m] = 0;}int main(){    int i;    memset(dp, -1, sizeof(dp));    scanf("%d %d",&n,&k);    for(i = 0;i<n;i++){        scanf("%d",&s[i]);        s[i] %= k;    }    if(solve(n-1,0))        printf("Divisible\n");    else        printf("Not divisible\n");    return 0;}


0 0