题意:给你一些不同价值和一定数量的硬币,求用这些硬币可以组合成价值在[1 , m]之间的有多少;
思路:由于考虑时间,所以需要用二进制优化;
#include<stdio.h>
#include<string.h>
#define max(x,y) (x>y?x:y)
int a[101],b[101],dp[100001];
int main()
{
int n,m;
while(scanf("%d%d",&n,&m),n||m)
{
int i,j,k,s,temp,st,
ss=0;
for(i=1;i<=n;i++)
scanf("%d",&a[i]);
memset(dp,0,sizeof(dp));
for(i=1;i<=n;i++)
{
int t=1;s=0;st=0;
scanf("%d",&k);
if(k*a[i]>=m)
for(j=a[i];j<=m;j++)
dp[j]=max(dp[j],dp[j-a[i]]+a[i]);//完全背包
else//01背包
{
s+=k*a[i];
while(t<=k)
{
temp=t*a[i];
k=k-t;
st+=t*a[i];
t*=2;
for(j=m;j>=temp;j--)
dp[j]=max(dp[j],dp[j-temp]+temp);
}
if(st<s)
{
temp=s-st;
for(j=m;j>=temp;j--)
dp[j]=max(dp[j],dp[j-temp]+temp);
}
}
}
for(i=1;i<=m;i++)
if(i==dp[i])
ss++;
printf("%d\n",ss);
}
}
本文介绍了一种使用二进制优化方法解决硬币组合问题的算法。通过完全背包和01背包思想,实现对给定数量及价值硬币的有效组合,以计算能够形成的目标价值范围内的所有可能组合。
&spm=1001.2101.3001.5002&articleId=50908949&d=1&t=3&u=2f4a79827f064172879545656a40f080)
590

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



