Educational Codeforces Round 28 B. Math Show

题意:我有n个任务,每个任务是相同的,每个任务分为k个子任务,给出k个子任务的花费时间,每完成一个子任务+1分,但是我完成一个大任务(即k个子任务)可获得k+1分,我现在有w时间,问最大分数获得

思路:dp,dp[j]表示我获得该积分消耗的最少时间,  dp[j+x] =min(dp[j+x],dp[j]+a[xx]);对子任务的花费时间排序,求个前缀和,即是当前这个任务的最优选择了

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 typedef long long ll;
 4 const ll INF=2000001000;
 5 typedef long long ll;
 6 
 7 ll a[55],dp[55*55];
 8 
 9 int main(){
10     int n,k;
11     int  m;
12     scanf("%d%d",&n,&k);
13     scanf("%d",&m);
14     for(int i=1;i<=k;i++) scanf("%d",&a[i]);
15     sort(a+1,a+1+k);
16     for(int i=1;i<=k;i++) a[i]+=a[i-1];
17     for(int i=1;i<=(k+1)*n;i++) dp[i]=INF;
18     dp[0]=0;
19     for(int i=1;i<=n;i++){
20         for(int j=n*(k+1);j>=0;j--){
21             for(int kk=0;kk<=k;kk++){
22                 if(kk!=k)
23                     dp[j+kk]=min(dp[j+kk],dp[j]+a[kk]);
24                 else
25                     dp[j+kk+1]=min(dp[j+kk+1],dp[j]+a[kk]);
26             }
27         }
28     }
29     for(int i=n*(k+1);i>=0;i--){
30         if(dp[i]<=m){
31             cout<<i<<endl;return 0;
32         }
33     }
34 }

 

posted on 2017-09-08 14:46  hhhhx  阅读(142)  评论(0编辑  收藏  举报

导航