简单dp
//P1336 最佳课题选择 #include<bits/stdc++.h> using namespace std; typedef long long ll; const ll inf=1e17; struct sub{ int a,b; }s[3000]; ll dp[3000][3000]; inline ll time(int i,int x){ if(!x) return 0; return 1ll*s[i].a*(pow(x,s[i].b)); } int main(){ int n,m; cin>>n>>m; for(int i=1;i<=m;i++){ cin>>s[i].a>>s[i].b; } for(int i=0;i<=m;i++){ for(int j=0;j<=n;j++){ dp[i][j]=inf; } } for(int i=0;i<=m;i++){ dp[i][0]=0; } for(int i=1;i<=m;i++){ for(int j=0;j<=n;j++){ for(int k=0;k<=j;k++){ dp[i][j]=min(dp[i][j],dp[i-1][j-k]+time(i,k)); } } } cout<<dp[m][n]; return 0; }