题意:我有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 }