多维背包 hrbudt 1335 算法与追MM
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
hrbust 1335 #include<string.h> //多进制储存数,第i位进制维back[i]+1,可以避免重复 #include<stdio.h> using namespace std; int vl[100000]; int w[105]; int back[105]; int v[105][10]; int c[105]; int n,m; int jinzhi[10]; int main() { //freopen("input.txt","r",stdin); int z,ok,now; while(~scanf("%d%d",&n,&m)) { memset(vl,0,sizeof(vl)); for(int i=0;i<m;i++){ scanf("%d",&back[i]); } for(int i=0;i<n;i++){ scanf("%d",&w[i]); for(int k=0;k<m;k++){ scanf("%d",&v[i][k]); } } jinzhi[0]=1; z=0; for(int i=0;i<m;i++){ jinzhi[i+1]=jinzhi[i]*(back[i]+1); z+=back[i]*jinzhi[i]; } for(int i=0;i<n;i++) { c[i]=0; for(int k=0;k<m;k++) { c[i]+=v[i][k]*jinzhi[k]; } } for(int i=0;i<n;i++) { for(int k=z;k>=c[i];k--) { ok=0; now=k; for(int j=0;j<m;j++) { if(now%(back[j]+1)<v[i][j]) { ok=1; break; } else now/=(back[j]+1); } if(ok==0)//printf("*"); if(vl[k]<vl[k-c[i]]+w[i]) vl[k]=vl[k-c[i]]+w[i]; } } printf("%d\n",vl[z]); printf("%d \n",z); for(int i=0;i<n;i++) printf("%d ",c[i]); } }