多维背包 hrbudt 1335 算法与追MM

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]);
}
}
View Code

 

posted @ 2014-03-13 20:23  icodefive  阅读(286)  评论(0编辑  收藏  举报