原题链接:
最佳课题选择 - 洛谷https://www.luogu.com.cn/problem/P1336思路:
很好奇为啥这题是绿题??明明就是最基础的背包问题.不多说了直接上代码
注意:因为有可能不从前面的课题中选所以k需要从0开始枚举
#include<bits/stdc++.h>
#define ll long long
using namespace std;
ll f[25][205];//只从前i个课题选j篇论文的最小时间
//f[1][j] = a[1]*(int)pow(j,b[1])
//状态转移方程 f[i][j] = min(f[i][j],f[i-1][k]+a[i]*(int)pow(j-k,b[i])
int n,m;
ll a[25],b[25];
int main(){
for(int i = 0;i<=24;++i)
for(int j = 0;j<=204;++j)
{
f[i][j] = 9223372036854775807;//不开longlong见祖宗
}
cin>>n>>m;
for(int i = 1;i<=m;++i){
cin>>a[i]>>b[i];
}
for(int i = 1;i<=n;++i)
f[1][i] = a[1]*(ll)pow(i,b[1]);
for(int i = 2;i<=m;++i)
for(int j = 1;j<=n;++j){
for(int k = 0;k<=j;++k){
if(k==0)//特判0
f[i][j] = min(f[i][j],a[i]*(ll)pow(j,b[i]));//只从当前课题选时
else
f[i][j] = min(f[i][j],f[i-1][k]+a[i]*(ll)pow(j-k,b[i]));//从前面课题选k篇论文时,即从当前课题选n-k篇论文
}
}
cout<<f[m][n]<<endl;
return 0;
}