混合背包问题
1 #include<iostream> 2 #include<algorithm> 3 #include<cstdio> 4 #include<memory.h> 5 using namespace std; 6 struct datatype 7 { 8 int a; 9 int b; 10 int c; 11 int d; 12 }data[11]; 13 int f[1001]; 14 int n,m,c,d; 15 void cal1(int x,int y) 16 { 17 for(int i=n;i>=x;i--) 18 { 19 f[i]=max(f[i],f[i-x]+y); 20 } 21 return; 22 } 23 void cal2(int x,int y) 24 { 25 for(int i=x;i<=n;i++) 26 { 27 f[i]=max(f[i],f[i-x]+y); 28 } 29 return; 30 } 31 void cal3(int x) 32 { 33 int tmp=data[x].a/data[x].b; 34 if(data[x].c*tmp>=n) 35 { 36 cal2(data[x].c,data[x].d); 37 return; 38 } 39 int k=1; 40 while(k<tmp) 41 { 42 cal1(k*data[x].c,k*data[x].d); 43 tmp-=k; 44 k*=2; 45 } 46 cal1(data[x].c*tmp,data[x].d*tmp); 47 return; 48 } 49 int main() 50 { 51 cin>>n>>m>>c>>d; 52 for(int i=1;i<=m;i++) 53 { 54 cin>>data[i].a>>data[i].b>>data[i].c>>data[i].d; 55 } 56 memset(f,0,sizeof(f)); 57 for(int i=0;i<=m;i++) 58 { 59 if(i==0) 60 { 61 cal2(c,d); 62 } 63 else 64 { 65 cal3(i); 66 } 67 } 68 int res=0; 69 for(int i=1;i<=n;i++) 70 { 71 res=max(res,f[i]); 72 } 73 cout<<res; 74 return 0; 75 }