标签:
题意: 输入n个有序数字,数字前可加上+或-,求是否存在这样的和,使得该和能够整除数字k
每个数字前只有取正或负两种情况,所以符合0,1背包,而且背包的重量是除k的余数(均是正数)
//172 KB 297 ms C++ 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背包)(好题)
标签:
原文地址:http://blog.csdn.net/kalilili/article/details/44179241