POJ 1745 Divisibility(0,1背包)(好题)

题意:输入n个有序数字,数字前可加上+或-,求是否存在这样的和,使得该和能够整除数字k

每个数字前只有取正或负两种情况,所以符合0,,1背包,而且背包的重量是除k的余数(均是正数)

//172 KB297 msC++785 B#include<cstdio>#include<cstring>#include<algorithm>#include<iostream>using namespace std;int num[10010];bool dp[2][105];int n,mod;int main(){while(~scanf("%d%d",&n,&mod)){memset(dp,0,sizeof(dp));dp[0][0]=true;for(int i=1;i<=n;i++) scanf("%d",&num[i]);for(int i=1;i<=n;i++){memset(dp[i&1],0,sizeof(dp[i&1]));for(int j=0;j<mod;j++){int t1=(j+num[i]+10000*mod)%mod;int t2=(j-num[i]+10000*mod)%mod;dp[i&1][t1]=max(dp[i&1][t1],dp[(i-1)&1][j]);dp[i&1][t2]=max(dp[i&1][t2],dp[(i-1)&1][j]);}}if(dp[n&1][0]) printf("Divisible\n");else printf("Not divisible\n");}return 0;}

自己战胜自己是最可贵的胜利。

POJ 1745 Divisibility(0,1背包)(好题)

相关文章:

你感兴趣的文章:

标签云: