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 |
学习啦!!!多重背包通过二进制化化为01背包,将O(V*N)降为O(V*logN),,,感谢背包九讲!#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