各种不同面值的货币,每种面值的货币有不同的数量,请找出利用这些货币可以凑成的最接近且小于等于给定的数字cash的金额。
标准背包题
#include "stdio.h"
#include "string.h"
#include "math.h"
int dp[100010],b[100010];
int main()
{
int i,j,cash,n;
int a[11],v[11];
while (scanf("%d",&cash)!=EOF)
{
memset(dp,0,sizeof(dp));
scanf("%d",&n);
for (i=1;i<=n;i++)
{
scanf("%d%d",&a[i],&v[i]);
}
for (i=1;i<=n;i++)
{
memset(b,0,sizeof(b));
for (j=v[i];j<=cash;j++)
if (dp[j]<dp[j-v[i]]+v[i] && b[j-v[i]]<a[i])
{
dp[j]=dp[j-v[i]]+v[i];
b[j]=b[j-v[i]]+1;
}
}
printf("%d\n",dp[cash]);
}
return 0;
}