Machine,里面装有n种面值为n[i]的货币,每种有v[i]张。问在所换金额不超过cash元钱的情况下,所能换取的最大金额。
思路:原版多重背包模版,直接用就行,不理解的看一多重背包的讲解(很详细)
//556K
47MS
#include <stdio.h>
#include <string.h>
#define M 100010
#define N 15
int dp[M],count[N],val[N];
int money;
int max (int a,int b)
{
> b ? a : b;
}
void MulPack (int cost,int amount)
{
;
(cost*amount >=
money)
//完全背包
for (v = cost;v <= money;v ++)
dp[v] = max (dp[v],dp[v-cost] + cost);
return ;
1;
< amount)
for (v = money;v >= k*cost;v
--)
dp[v] = max (dp[v],dp[v-k*cost] + k*cost);
amount -= k;
k *= 2;
money;v >= amount*cost;v --)
dp[v] = max (dp[v],dp[v-amount*cost] + amount*cost);
}
int main ()
{
n,i;
(~scanf ("%d%d",&money,&n))
memset (dp,0,sizeof(dp));
for (i = 0;i < n;i ++)
scanf
("%d%d",&count[i],&val[i]);
for (i = 0;i < n;i ++)
MulPack(val[i],count[i]);
printf ("%d\n",dp[money]);
}