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 |
Re:学习啦!!!多重背包通过二进制化化为01背包,将O(V*N)降为O(V*logN),,,感谢背包九讲!In Reply To:学习啦!!!多重背包通过二进制化化为01背包,将O(V*N)降为O(V*logN),,,感谢背包九讲! Posted by:xijunlee93 at 2013-03-31 23:33:40 > > #include<fstream> > using namespace std; > int f[100010]; > int n[230],w[230],v,N; > int b[11]={1,2,4,8,16,32,64,128,256,512,1024}; > int max(int a,int b) > { > if (a>b) > return a; > else > return b; > } > int main() > { > ifstream infile; > ofstream outfile; > infile.open("data.in",ios::in); > outfile.open("data.out",ios::out); > int i,j,cash,count,k; > int nn,ww; > while(infile>>cash) > { > memset(f,0,sizeof(f)); > memset(n,0,sizeof(n)); > memset(w,0,sizeof(w)); > infile>>N; > count=1; > for (i=1;i<=N;i++) > { > infile>>nn>>ww; > if (nn!=0) > {for (j=10;j>=0;j--) > if(nn-b[j]+1>0) > break; > for (k=0;k<=j-1;k++) > {n[count]=b[k];w[count]=ww*b[k];count++;} > n[count]=nn-b[j]+1;w[count]=ww*(nn-b[j]+1);count++;} > } > count--; > for (i=1;i<=count;i++) > for (v=cash;v>=0;v--) > if (v-w[i]>=0) > f[v]=max(f[v],f[v-w[i]]+w[i]); > outfile<<f[cash]<<endl; > } > return 0; > } Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator