这一题是完全背包问题,因为每种类型可选入的题目数量不限。
定义dp_i,j为用j的时间做前i种题目能得到的最大分值。由于数据较大,需要优化过的方法:在j大于第i类题所需要的时间时,dp_i,j=max(dp_i,j,dp_i,j-min[i]+p[i])
#include<cstdio>
#include<algorithm>
using namespace std;
int n,m,v[26],p[26],dp[26][30001];
int main(){
scanf("%d %d",&n,&m);
for(int i=1;i<=m;i++) scanf("%d %d",&v[i],&p[i]);
for(int i=1;i<=m;i++){
for(int j=1;j<=n;j++){
dp[i][j]=dp[i-1][j];
if(j>v[i]) dp[i][j]=max(dp[i][j],dp[i-1][j-v[i]]+v[i]*p[i]);
}
}
printf("%d",dp[m][n]);
return 0;
}
比赛已结束。