/*
poj 1276
多重背包题目,cost 与 value 是同一个
*/
#include <iostream>
using namespace std;
int inline Max(int a,int b)
{
if(a>b)
return a;
return b;
}
int W[12],V[12],dp[100010];
int main()
{
int n,i,j,k,cash,amount;
while(cin>>cash>>n)
{
for(i=0;i<100010;i++)
dp[i]=0;
for(i=0;i<n;i++)
{
cin>>W[i]>>V[i];
dp[ V[i] ] = V[i];
}
for(i=0;i<n;i++)
{
if(W[i]*V[i]>=cash)
{
//完全背包
for(j=V[i];j<=cash;j++)
dp[j] = Max(dp[j] , dp[j-V[i]] + V[i]);
}
else
{
//多重背包
k=1;
amount = W[i];
while(k < amount)
{
for(j=cash;j >= k*V[i];j--)
dp[j] = Max(dp[j] , dp[j - k*V[i]]+k*V[i]);
amount -= k;
k *= 2;
}
if(amount > 0)
{
for(j=cash ; j >= amount*V[i] ;j--)
{
//amount 现在是分解为k^2之后剩下的
dp[j] = Max(dp[j] , dp[j-amount*V[i]]+amount*V[i]);
}
}
}
}
cout<<dp[cash]<<endl;
}
return 0;
}
多重背包——POJ 1276
最新推荐文章于 2021-03-05 18:13:33 发布
454

被折叠的 条评论
为什么被折叠?



