背包问题小合集
01背包 完全背包 多重背包混着来
对于01背包:把它想象成最大物品数为1的多重背包
对于完全背包:把它想象成最大物品数为m/w[i]的多重背包
对于多重背包:把它想象成。。。等等这本来就是个多重背包
数据比较水 但是我也写了个倍增优化
#include<iostream> #include<cstdio> #include<algorithm> #include<cstdlib> #include<cmath> #include<cstring> using namespace std; int f[300]; int v[300],W[300],m[300]; int i,j; int main() { string ts,te; int n; cin>>ts>>te; cin>>n; int a1=0,a2=0; int flag1,flag2; for(i=0;i<ts.length();i++)if(ts[i]==':')flag1=i; for(i=0;i<te.length();i++)if(te[i]==':')flag2=i; for(i=0;i<flag1;i++)a1=10*a1+ts[i]-'0'; int temp=0; for(i=flag1+1;i<ts.length();i++)temp=10*temp+ts[i]-'0'; a1=60*a1+temp; for(i=0;i<flag2;i++)a2=10*a2+te[i]-'0'; temp=0; for(i=flag2+1;i<te.length();i++)temp=10*temp+te[i]-'0'; a2=60*a2+temp; int w=a2-a1; while(n--) { int i,j; int Value,weight,m; scanf("%d%d%d",&weight,&Value,&m); if(m==0)m=w/weight; for(i=0;((1<<(i+1))-1)<=m;i++) for(j=w;j>=(weight<<i);j--)f[j]=max(f[j],f[j-(weight<<i)]+(Value<<i)); weight=weight*m-(weight<<i)+weight;Value=Value*m-(Value<<i)+Value; if(weight>0) for(j=w;j>=weight;j--)f[j]=max(f[j],f[j-weight]+Value); } printf("%d",f[w]); }
倍增优化详见
http://www.cnblogs.com/Kong-Ruo/p/7700718.html