hdu 1059 Dividing(pku 1042)
2011-11-25 20:56
288 查看
http://acm.hdu.edu.cn/showproblem.php?pid=1059
http://poj.org/problem?id=1014
多重背包
这个题有两种AC的方法一种是采用多重背包的方法,但是这个方法会超时,所以就加了一个取模(这是错误的地方)来减少时间,这个方法可以AC,但却是错误的 12 0 0 0 0 1 这组数据就不能正确的出结果;
View Code
http://poj.org/problem?id=1014
多重背包
这个题有两种AC的方法一种是采用多重背包的方法,但是这个方法会超时,所以就加了一个取模(这是错误的地方)来减少时间,这个方法可以AC,但却是错误的 12 0 0 0 0 1 这组数据就不能正确的出结果;
View Code
#include<iostream> using namespace std; int m1[60001],m2[120010]; int array[7]; void calc(int *s,int m,int n) { int i,j,k,sum=0,rest; for(i=1;i<60001;i++) s[i]=0; s[0]=1; for(i=m;i<=n;i++) { sum+=array[i]*i; for(j=1;j<array[i];j*=2) { for(k=sum;k>=j*i;k--) if(s[k]==0&&s[k-j*i]) s[k]=1; } j=array[i]-j/2; for(k=sum;k>=j*i;k--) if(s[k]==0&&s[k-j*i]) s[k]=1; } } int main() { int i,times=1,a,flag; while(cin>>array[1]) { flag=0; array[0]=0; for(i=2;i<7;i++) { cin>>array[i]; array[0]+=array[i]*i; } array[0]+=array[1]; if(array[0]==0) break; if(array[0]%2) {cout<<"Collection #"<<times++<<":"<<endl;cout<<"Can't be divided.\n"<<endl;continue;} array[0]/=2; calc(m1,1,3); calc(m2,4,6); for(i=0;i<=array[0];i++) if(m1[i]&&m2[array[0]-i]) { flag=1;break; } cout<<"Collection #"<<times++<<":"<<endl; if(flag) cout<<"Can be divided."<<endl; else cout<<"Can't be divided."<<endl; cout<<endl; } return 0; }
相关文章推荐
- (pku 1014) (hdu 1059) (zoj 1049) Dividing muhanshu
- 【HDU 1059 Dividing 多重背包 】
- hdu1059 Dividing 搜索
- 【日常学习】【多重背包】【二进制优化】hdu1059 Dividing题解
- hdu_1003_Max Sum hdu_1058_Humble Numbers hdu_1059_Dividing
- HDU 1059 Dividing 多重背包二进制优化
- HDU 1059- Dividing
- [0-1背包]HDU 1059 Dividing
- hdu 1059 Dividing(多重背包)
- HDU-1059 Dividing (多重背包 二进制优化+剪枝)
- HDU——1059 Dividing(多重背包+二进制优化)
- hdu1059---Dividing
- HDU1059_Dividing【多重背包】【二进制】
- [hdu1059]Dividing 多重背包
- HDU1059-Dividing-DP(多重背包)
- (step3.3) hdu 1059(Dividing——多重背包)
- HDU 1059 Dividing
- HDU 1059 Dividing 多重背包
- hdu1059 Dividing ——多重背包
- HDU1059——多重部分和问题——Dividing