CF846B
原题链接:Math Show
话归原题,接下来就是快乐的解题时间啦~
(博客里食用更佳)
首先,我们可以发现 \(n\) 和 \(k\) 的数据范围都非常小,其次,每个子任务分值相同,设 \(dp[i]\) 为做了 \(i\) 个完整的任务(其余做的是单独子任务)的最多分数将 \(t\) 数组排序后暴力求解
也不多说了,剩下的注释都在代码里了~
#include<iostream>
#include<cstdio>
#include<algorithm> //sort需要的
using namespace std;
int n,k,N,sum,ans,nim,s,t[55],a[55];//a[i]为做了i个完整的任务(其余做的事单独子任务)最多的分数
int main(){
cin>>n>>k>>N;
for(int i=1; i<=k; i++){scanf("%d",&t[i]);sum+=t[i];}
sort(t+1,t+1+k);//给t数组排序
for(int i=0; i<=n; i++){//暴力
if(sum*i>N) break;
a[i]=i*k+i;
nim=n-i;
s=sum*i;
for(int j=1; j<=k; j++){
for(int sss=1; sss<=nim; sss++){
s+=t[j];
if(s>N) break;
a[i]++;
}
if(s>N) break;
}
ans=max(a[i],ans);//如果做了i个完整的任务最多分数比ans大,那他就是最多能挣的分数
}
cout<<ans;
return 0;
}
//P上水印
//┭┮﹏ ┭┮