3 10 1 2 4 2 1 1 2 5 1 4 2 1 0 0
8 4
#include <stdio.h>
#include <string.h>
#define M 100100
#define N 110
int a[N] , c[N] , dp[M] ;
void zeroOnePack(int value , int m)
{
for(int i = m ; i >= value ; --i)
{
if(dp[i]<dp[i-value]+value)
{
dp[i] = dp[i-value]+value ;
}
}
}
void completePack(int value , int m)
{
for(int i = value ; i <= m ; ++i)
{
if(dp[i]<dp[i-value]+value)
{
dp[i] = dp[i-value]+value ;
}
}
}
void multiplePack(int value , int count , int total)
{
if(value*count>total)
{
completePack(value , total) ;
}
else
{
int k = 1 ;
while(k<=count)
{
zeroOnePack(k*value , total) ;
count -= k ;
k = 2*k ;
}
zeroOnePack(count*value,total) ;
}
}
int main()
{
int n ,m ;
while(~scanf("%d%d",&n,&m) && (n||m))
{
for(int i = 0 ; i < n ; ++i)
{
scanf("%d",&a[i]);
}
for(int i = 0 ; i < n ; ++i)
{
scanf("%d",&c[i]);
}
memset(dp,0,sizeof(dp)) ;
for(int i = 0 ; i < n ; ++i)
{
multiplePack(a[i],c[i],m);
}
int ans = 0 ;
for(int i = 1 ; i <= m ; ++i)
{
if(i == dp[i])
{
++ans ;
}
}
printf("%d\n",ans) ;
}
return 0 ;
}hdu 2844 Coins 多重背包模板题 ,二进制优化。据说是楼教主的男人八题之一
原文地址:http://blog.csdn.net/lionel_d/article/details/43733979