题目:http://poj.org/problem?id=1276
背包问题。
看指定的货币能组合成哪些情况。钱最多且<=cash的即是答案。
代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int a[11],type[11],m[100001];
int main()
{
int money,num,i,j,k;
while(~scanf("%d%d",&money,&num))
{
for(i =0 ; i < num ; ++i)
{
scanf("%d%d",&a[i],&type[i]);
m[type[i]] = 1;
}
memset(m,0,sizeof(m));
m[0] = 1;
for(i = 0 ; i < num ; ++i)//几种货币
{
for(j = money ; j >= 0 ; --j)
if(m[j])
{
for(k = 1; k <= a[i]; ++k)
{
if(j + k*type[i] > money) break;
m[j+k*type[i]] = 1; //可以得到 j+k*type[i]
}
}
}
for(i = money ; i >= 0 ; --i)
if(m[i])
{
printf("%d\n",i);
break;
}
}
// system("pause");
return 0;
}