这题是一个背包。。。

令f[i]表示花费i元钱能达到的最大的物品与价格的乘积的总和

所以就有 f[i]=max{f[i],f[i-v[j]]+v[i]*w[i]}

//My Code:
#include <cstdio>
#include <algorithm>
using namespace std;
int n,m,fm[30005];
struct node{
    int v,p;
}mm[30];
bool cp(node a,node b){
    if(a.p!=b.p)return a.p>b.p;
    else return a.v<b.v;
}
int max(int a,int b){return a>b?a:b;}
int main(){
    scanf("%d%d",&n,&m);
    for(int i=1;i<=m;i++)scanf("%d%d",&mm[i].v,&mm[i].p);
    sort(mm+1,mm+m+1,cp);
    for(int i=1;i<=m;i++){
        for(int j=n;j>=mm[i].v;j--){
            fm[j]=max(fm[j],fm[j-mm[i].v]+mm[i].v*mm[i].p);
        }
    }
    printf("%d",fm[n]);
    return 0;
}