#include<stdio.h>
#include<stdlib.h>
#define MAX 30000+1
int main(void)
{
int v[25+1];
int p[25+1];
int num[MAX]={0};
int number,money;
int i,j;
scanf("%d %d",&money,&number);
for(i=0;i<number;i++)
{
scanf("%d %d",&v[i],&p[i]);
}
//动态规划
/*
分析:
因为每件物品只有一个,所以可化为简单的背包问题:
令f[n]等于钱数为n时最大的乘积和
对于第i件物品来说,有两种情况:
1. 购买(价值为 f[n-v[i]]+v[i]*p[i])
2. 不购买 (价值为 f[n])
整理为状态转移方程:
f[n]=max{f[n],f[n-v[i]]+v[i]*p[i]}
*/
for(i=0;i<number;i++)
{
for(j=money;j>=v[i];j--)
{
num[j]=(num[j]>num[j-v[i]]+v[i]*p[i])?num[j]:(num[j-v[i]]+v[i]*p[i]);
}
}
printf("%d\n",num[money]);
return 0;
}
#include<stdlib.h>
#define MAX 30000+1
int main(void)
{
int v[25+1];
int p[25+1];
int num[MAX]={0};
int number,money;
int i,j;
scanf("%d %d",&money,&number);
for(i=0;i<number;i++)
{
scanf("%d %d",&v[i],&p[i]);
}
//动态规划
/*
分析:
因为每件物品只有一个,所以可化为简单的背包问题:
令f[n]等于钱数为n时最大的乘积和
对于第i件物品来说,有两种情况:
1. 购买(价值为 f[n-v[i]]+v[i]*p[i])
2. 不购买 (价值为 f[n])
整理为状态转移方程:
f[n]=max{f[n],f[n-v[i]]+v[i]*p[i]}
*/
for(i=0;i<number;i++)
{
for(j=money;j>=v[i];j--)
{
num[j]=(num[j]>num[j-v[i]]+v[i]*p[i])?num[j]:(num[j-v[i]]+v[i]*p[i]);
}
}
printf("%d\n",num[money]);
return 0;
}