0x52 背包
还行
前面的题没啥意思
完全背包一个很难写的题poj1015 Jury Compromise
poj1742 多重背包啊,开始写了二进制拆分TLE了,由于是判是否可以组成,那么可以用一个贪心的思想,顺着for一个个叠加
#include<cstdio> #include<iostream> #include<cstring> #include<cstdlib> #include<algorithm> #include<cmath> using namespace std; int a[110],c[110],q[2100]; bool f[110000]; int main() { int n,m; while(scanf("%d%d",&n,&m)!=EOF) { if(n==0||m==0)break; for(int i=1;i<=n;i++)scanf("%d",&a[i]); for(int i=1;i<=n;i++)scanf("%d",&c[i]); int len=0; for(int i=1;i<=n;i++) { int k=(1<<10); while(k-1>c[i])k>>=1; k>>=1; while(k>0) { q[++len]=a[i]*k; c[i]-=k;k>>=1; } if(c[i]!=0)q[++len]=a[i]*c[i]; } n=len; //------------二进制拆分----------------- memset(f,false,sizeof(f));f[0]=true; for(int i=1;i<=n;i++) for(int j=m;j>=q[i];j--) if(f[j-q[i]]==true)f[j]=true; int ans=0; for(int i=1;i<=m;i++) if(f[i]==true)ans++; printf("%d\n",ans); } return 0; }
#include<cstdio> #include<iostream> #include<cstring> #include<cstdlib> #include<algorithm> #include<cmath> using namespace std; int a[110],c[110]; bool f[110000]; int u[110000]; int main() { int n,m; while(scanf("%d%d",&n,&m)!=EOF) { if(n==0||m==0)break; for(int i=1;i<=n;i++)scanf("%d",&a[i]); for(int i=1;i<=n;i++)scanf("%d",&c[i]); memset(f,false,sizeof(f));f[0]=true; for(int i=1;i<=n;i++) { memset(u,0,sizeof(u)); for(int j=a[i];j<=m;j++) if(f[j]==false&&f[j-a[i]]==true&&u[j-a[i]]<c[i]) { f[j]=true; u[j]=u[j-a[i]]+1; } } int ans=0; for(int i=1;i<=m;i++) if(f[i]==true)ans++; printf("%d\n",ans); } return 0; }
分组背包没例题啊,而且好像也没什么
pain and happy in the cruel world.