Code
1#include<cstring>
2#include<cstdio>
3int const M=100000,N=10;
4int v[N][2],dp[M][2];
5int m,n,ans;
6int main()
7{
8 bool readin();
9 void solve();
10 while(readin())
11 solve();
12 return 0;
13}
14bool readin()
15{
16 int k;
17 if(scanf("%d%d",&m,&n)==EOF)
18 return false;
19 for(k=0;k<n;k++)
20 scanf("%d%d",&v[k][0],&v[k][1]);
21 return true;
22}
23void solve()
24{
25 int i,j,k;
26 memset(dp,0,sizeof(dp));
27 dp[0][0]=1;
28 ans=0;
29 for(i=0;i<n;i++)
30 {
31 for(j=0;j<=m;j++)
32 dp[j][1]=0;/**//// 对于每一个币种 对应的硬币用个数都是0
33 for(j=1;j<=m;j++)
34 {
35 if(dp[j][0]==0)
36 {
37 k=j-v[i][1];
38 if(k>=0&&dp[k][0]==1&&dp[k][1]<v[i][0])
39 {
40 dp[j][0]=1;
41 dp[j][1]=dp[k][1]+1;
42 if(j>ans)
43 ans=j;
44 }
45 }
46 else
47 {
48 if(j>ans)
49 ans=j;
50 }
51 }
52 }
53 printf("%d\n",ans);
54}
1#include<cstring>
2#include<cstdio>
3int const M=100000,N=10;
4int v[N][2],dp[M][2];
5int m,n,ans;
6int main()
7{
8 bool readin();
9 void solve();
10 while(readin())
11 solve();
12 return 0;
13}
14bool readin()
15{
16 int k;
17 if(scanf("%d%d",&m,&n)==EOF)
18 return false;
19 for(k=0;k<n;k++)
20 scanf("%d%d",&v[k][0],&v[k][1]);
21 return true;
22}
23void solve()
24{
25 int i,j,k;
26 memset(dp,0,sizeof(dp));
27 dp[0][0]=1;
28 ans=0;
29 for(i=0;i<n;i++)
30 {
31 for(j=0;j<=m;j++)
32 dp[j][1]=0;/**//// 对于每一个币种 对应的硬币用个数都是0
33 for(j=1;j<=m;j++)
34 {
35 if(dp[j][0]==0)
36 {
37 k=j-v[i][1];
38 if(k>=0&&dp[k][0]==1&&dp[k][1]<v[i][0])
39 {
40 dp[j][0]=1;
41 dp[j][1]=dp[k][1]+1;
42 if(j>ans)
43 ans=j;
44 }
45 }
46 else
47 {
48 if(j>ans)
49 ans=j;
50 }
51 }
52 }
53 printf("%d\n",ans);
54}