有没有大佬帮忙看一下,感谢!!!!
这个是80分:
//f(i,j)表示前i个论文,目前用了前j个课题花费的最少时间
#include<iostream>
#include<cstring>
#include<string>
#include<queue>
#include<utility>
#include<cmath>
#define int unsigned long long
using namespace std;
const int N=310;
int n,m,f[N][N];
struct num{
int x,y;
}a[N];
int get(int i,int len){
int ans=a[i].x;
for(int c=1;c<=a[i].y;c++)
ans*=len;
return ans;
}
signed main(){
cin>>n>>m;
for(int i=1;i<=m;i++) cin>>a[i].x>>a[i].y;
memset(f,0x3f,sizeof(f));
f[0][0]=0;//我是这样初始化的
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
for(int k=0;k<=i;k++){
int t=get(j,k);
f[i][j]=min(f[i][j],f[i-k][j-1]+t);
}
cout<<f[n][m];
return 0;
}
/*
f(i,j)=f(i-k,j-1)+get()
i,j,k
*/
这个是100分(按照第一篇题解的初始化):
#include<iostream>
#include<cstring>
#include<string>
#include<queue>
#include<utility>
#include<cmath>
#define int unsigned long long
using namespace std;
const int N=310;
int n,m,f[N][N];
struct num{
int x,y;
}a[N];
int get(int i,int len){
int ans=a[i].x;
for(int c=1;c<=a[i].y;c++)
ans*=len;
return ans;
}
signed main(){
cin>>n>>m;
for(int i=1;i<=m;i++) cin>>a[i].x>>a[i].y;
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
for(int k=0;k<=i;k++){
int t=get(j,k);
if(!f[i][j]||j==1) f[i][j]=f[i-k][j-1]+t;//这个初始化直接在代码中
else f[i][j]=min(f[i][j],f[i-k][j-1]+t);
}
cout<<f[n][m];
return 0;
}
/*
f(i,j)=f(i-k,j-1)+get()
i,j,k
*/