比较简单的背包题
代码:
#include<cstdio>
#include<cstring>
#include<iostream>
#define MAX 100001
using namespace std;
int cash,n,num[11],d[11],dp[11][MAX];
int main()
{
while(scanf("%d%d",&cash,&n)!=EOF)
{
for(int i=1;i<=n;i++)
scanf("%d%d",&num[i],&d[i]);
memset(dp,0,sizeof(dp));
dp[0][0]=1;
if(cash==0||n==0)
{
printf("0\n");
continue;
}
for(int i=1;i<=n;i++)
{
for(int j=cash;j>=0;j--)
{
if(dp[i-1][j])
{
dp[i][j]=1;
for(int k=1;k<=num[i];k++)
{
if(j+d[i]*k<MAX)
dp[i][j+d[i]*k]=1;
else
break;
}
}
}
}
if(dp[n][cash])
printf("%d\n",cash);
else
{
int ans=0;
for(int i=cash;i>=0;i--)
{
if(dp[n][i])
{
ans=i;
break;
}
}
printf("%d\n",ans);
}
}
return 0;
}