2844 coins
题意:给出每种硬币的价值和数量,问能组成m以内的面值有多少种
多重背包二进制优化版,转01会超时的
#include<iostream>
#include<algorithm>
#define maxn 100010
#define max(x,y) (x)>(y)?(x):y
using namespace std;
int dp[maxn],n,k;
int v[101],w[101],V;
void zero(int cost) //01背包
{
for(int i=V;i>=cost;i--)
dp[i]=max(dp[i],dp[i-cost]+cost);
}
void complet(int cost) //完全背包
{
for(int i=cost;i<=V;i++)
dp[i]=max(dp[i],dp[i-cost]+cost);
}
void multi(int cost,int amount)
{
if(cost * amount>=V) //大于V的处理
{
complet(cost);
return ;
}
int k=1;
while(k<amount)
{
zero(k*cost);
amount-=k;
k<<=1;
}
zero(amount*cost); //剩余处理
}
int main()
{
while(scanf("%d %d",&n,&V)==2&&(n||V))
{
for(int i=0;i<n;i++)
scanf("%d",&v[i]);
for(i=0;i<n;i++)
scanf("%d",&w[i]);
for(i=1;i<=V;i++)
dp[i]=INT_MIN;
dp[0]=0;
for(i=0;i<n;i++)
multi(v[i],w[i]);
int count=0;
for(i=1;i<=V;i++)
if(dp[i]>=0)
count++;
printf("%d\n",count);
}
return 0;
}
HDU 2844 coins
最新推荐文章于 2020-07-31 10:59:51 发布