将多重背包问题转化成01背包.使用模板...
//这是一个多重背包问题,用模板转化成01背包
#include <stdio.h>
#include <iostream>
#include <memory.h>
using namespace std;
int dp[100001];
int num[1001];//每一种物品的数目
int v[1001];//每一种物品的价值
int V,N;
//此题中每个物品的价值和重量是一样的
void ZeroOnePack(int value,int weight)
{
for(int i = V;i >= value;i--)
dp[i] = max(dp[i],dp[i - value] + weight);
}
void CompletePack(int value,int weight)
{
for(int i = value;i <= V;i++)
{
dp[i] = max(dp[i],dp[i - value] + weight);
}
}
void MultiplePack(int value,int weight,int amount)
{
if(value * amount >= V)
{
CompletePack(value,weight);
return;
}
int k = 1;
while(k < amount)
{
ZeroOnePack(k * value,k * weight);
amount = amount - k;
k = k * 2;
}
ZeroOnePack(amount * value,amount * weight);
}
int main()
{
while(cin >> V >> N)
{
for(int i = 1;i <= N;i++)
cin >> num[i] >> v[i];
memset(dp,0,sizeof(dp));
for(int i = 1;i <= N;i++)
{
MultiplePack(v[i],v[i],num[i]);
}
cout << dp[V] << endl;
}
return 0;
}