题目链接:
http://acm.hdu.edu.cn/showproblem.php?pid=2844
题解:
多重背包模板题,注意要用c语言的输入,否则会超时,同时01背包处要做优化。
AC代码:
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
using namespace std;
int number,value;
int cost[200],weight[200];
int dp[100000];
void zeroOnePack(int cost)
{
for(int i = value; i >= cost; i--)
{
dp[i] = max(dp[i], dp[i - cost] + cost);
}
}
void completePack(int cost)
{
for(int i = cost; i <= value; i++)
dp[i] = max(dp[i], dp[i - cost] + cost);
}
void multiplePack(int cost , int cnt)
{
if(cost * cnt >= value)
completePack(cost);
else
{
/*for(int i = 1; i <= cnt; i++)
{
zeroOnePack(cost);//超时的写法
}*/
int i = 1;
while(i <= cnt)
{
zeroOnePack(cost * i);
cnt -= i;
i *= 2;
}
zeroOnePack(cost * cnt);
}
}
int main()
{
while(cin >> number >> value)
{
if(number == 0 && value == 0)break;
for(int i = 0; i < number; i++)
scanf("%d" , &cost[i]);
for(int i = 0; i < number; i++)
scanf("%d" , &weight[i]);
for(int i = 0; i < number; i++)
multiplePack(cost[i], weight[i]);
int sum = 0;
for(int i = 1; i <= value; i++)
{
if(dp[i] == i)
sum ++;
}
cout << sum <<endl;
memset(dp,0,sizeof(dp));
}
return 0;
}