http://acm.hdu.edu.cn/showproblem.php?pid=2844
多重背包+二进制优化
学习了一下 二进制优化
卡在了 二进制的判定那
int len=0;
int num=1;
while(w[i]-num*2+1>0)
{
d[len++]=num*v[i];
num*=2;
}
d[len++]=(w[i]-num+1)*v[i];
这个是重点 记住下
代码:
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <string.h>
#include <iostream>
#include <algorithm>
#include <map>
#include <set>
#include <queue>
using namespace std;
int n,m,k,s;
int f[100005];
int d[1005];
int v[1005];
int w[1005];
int main()
{
while(scanf("%d%d",&n,&m),n|m)
{
memset(f,0,sizeof(f));
f[0]=1;
for(int i=1;i<=n;i++)
scanf("%d",&v[i]);
for(int i=1;i<=n;i++)
scanf("%d",&w[i]);
if(m<=0)
{
printf("0\n");
continue;
}
for(int i=1;i<=n;i++)
{
int len=0;
int num=1;
while(w[i]-num*2+1>0)
{
d[len++]=num*v[i];
num*=2;
}
d[len++]=(w[i]-num+1)*v[i];
for(int j=0;j<len;j++)
{
for(int k=m;k>=d[j];k--)
{
if(f[k-d[j]])
f[k]=1;
}
}
}
int sign=0;
for(int i=1;i<=m;i++)
if(f[i])
sign++;
printf("%d\n",sign);
}
}