转化为背包。。
此题包含了01背包和完全背包
当然只用01背包也是可以的
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxn=100005;
int dp[maxn];
int cash,n;
void complete_pack(int v)
{
int i;
for(i=v;i<=cash;i++)
{
dp[i]=max(dp[i],dp[i-v]+v);
}
}
void zero_pack(int v)
{
int i;
for(i=cash;i>=v;i--)
{
dp[i]=max(dp[i],dp[i-v]+v);
}
}
void multiple_pack(int v,int nv)
{
if(v*nv>=cash)
{
complete_pack(v);
}
else
{
int i;
for(i=1;nv>0;i<<=1)
{
if(i>nv)
{
i=nv;
}
nv-=i;
zero_pack(i*v);
}
}
}
int main()
{
while(~scanf("%d%d",&cash,&n))
{
int v,nv;
memset(dp,0,sizeof(dp));
while(n--)
{
scanf("%d%d",&nv,&v);
multiple_pack(v,nv);
}
printf("%d\n",dp[cash]);
}
return 0;
}
本文详细介绍了如何通过结合01背包和完全背包算法解决背包问题,包括具体实现步骤和代码解析。
509

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



