Online Judge | Problem Set | Authors | Online Contests | User | ||||||
---|---|---|---|---|---|---|---|---|---|---|
Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest |
我用多重背包过的,但是看见很多大牛用%算法过的,不是很懂,有没有大牛能给个证明呢?并且在算法是加了个%30的,由700MS变为0MS了,但是不知道为什么。。。能有大牛解释一下吗?????不胜感激~~~我用多重背包过的,但是看见很多大牛用%算法过的,不是很懂,有没有大牛能给个证明呢???不胜感激~~~并且在算法是加了个%30的,由700MS变为0MS了,但是不知道为什么。。。能有大牛解释一下吗???? 为什么%6会错,%12才AC呢??? #include<cstdio> #include<cstring> #define N 200010 bool vist[N]; int main() { int a[10]; int cont = 1; while(true) { for(int i = 1;i<=6;i++) scanf("%d",&a[i]); if(a[1]==0&&a[2]==0&&a[3]==0&&a[4]==0&&a[5]==0&&a[6]==0) break; vist[0] = true; int sum = 0; for(int i = 1;i<=6;i++) { a[i]%=30;////我在这里加了之前没有就700MS,有就0MS sum+=i*a[i]; } printf("Collection #%d:\n",cont++); if(sum%2!=0) { printf("Can't be divided.\n\n"); continue; } for(int i = 1;i<=sum;i++) vist[i] = false; for(int i = 1;i<=6;i++) if(a[i]) for(int j = sum;j>=0;j--) if(vist[j]) for(int k = 1;k<=a[i];k++) { if(j+k*i>sum) break; vist[j+k*i] = true; if(vist[sum/2])///////剪啊剪啊!!!!!!! goto end; //printf("%d\n",j+k*i); } end: if(vist[sum/2]) printf("Can be divided.\n"); else printf("Can't be divided.\n"); printf("\n"); } } Followed by:
Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator