题意:有各种不同面值的货币,每种面值的货币有不同的数量,请找出利用这些货币可以凑成的最接近且小于等于给定的数字cash的金额。
思路:简单的完全背包。
#include <stdio.h>
#include <string.h>
#define N 100005
int dp[N],num[15],v[15];
int n,m;
int main(){
while(scanf("%d",&m)!=EOF){
int i,j,k;
memset(dp,0,sizeof(dp));
dp[0] = 1;
scanf("%d",&n);
for(i = 1;i<=n;i++)
scanf("%d %d",&num[i],&v[i]);
for(i = 1;i<=n;i++)
for(j = m-1;j>=0;j--)
if(dp[j])
for(k = 1;j+k*v[i]<=m && !dp[j+k*v[i]] && k<=num[i];k++)
dp[j+k*v[i]] = 1;
for(i = m;;i--)
if(dp[i]){
printf("%d\n",i);
break;
}
}
}