poj1745(01背包)

来源:互联网 发布:淘宝飞利浦官方旗舰店 编辑:程序博客网 时间:2024/05/23 16:54

链接:点击打开链接

题意:给出N个数,这N个数中每个数必须用1次,做加减运算,求最后结果是否能整除K

代码:

#include <iostream>#include <cstdio>#include <cstring>#include <cmath>#include <stdlib.h>using namespace std;int dp[10005][105],s[10005];                //dp[i][j]代表前i个数做运算后余数是否等于jint main(){    int n,k,i,j;    while(scanf("%d%d",&n,&k)!=EOF){        for(i=0;i<n;i++){        scanf("%d",&s[i]);        s[i]=abs(s[i])%k;        }        memset(dp,0,sizeof(dp));        dp[0][s[0]]=1;        for(i=1;i<n;i++)        for(j=k-1;j>=0;j--){            if(dp[i-1][j]){                dp[i][(j+s[i])%k]=1;                dp[i][((j-s[i])%k+k)%k]=1;  //加上k防止产生负值            }        }//        for(i=0;i<n;i++){//            for(j=0;j<k;j++)//            cout<<dp[i][j]<<" ";//            cout<<endl;//        }        if(dp[n-1][0])        printf("Divisible\n");        else        printf("Not divisible\n");    }    return 0;}

0 0
原创粉丝点击