Rabbit的工作(2)
题目描述
Rabbit通过了上次boss的考核,现在她又遇到了一个问题。
Rabbit接到了K个任务,每个任务她可以自由选择用i天去完成(1≤ i≤ N)。刁钻的boss想让Rabbit恰好用W天完成所有任务。
已知Rabbit用i天完成一个任务能让boss获得的满意度为vi(因为完成任务的质量不同),她想知道在满足boss要求的情况下能让boss获得的总满意度最大是多少。
Rabbit接到了K个任务,每个任务她可以自由选择用i天去完成(1≤ i≤ N)。刁钻的boss想让Rabbit恰好用W天完成所有任务。
已知Rabbit用i天完成一个任务能让boss获得的满意度为vi(因为完成任务的质量不同),她想知道在满足boss要求的情况下能让boss获得的总满意度最大是多少。
输入描述:
第一行三个整数N,K,W。
第二行N个整数vi,vi表示用i天完成一个任务能让boss获得的满意度。
输出描述:
输出Rabbit在满足boss要求的情况下能让boss获得的总满意度最大是多少。
输入
3 3 5 6 2 4
输出
16
说明
Rabbit可以选择分别用1天,1天,3天完成这三个任务,最大满意度为6+6+4=16
备注:
2≤ N,K≤ 2000,K≤ W≤ min(4000,2*K)
0<vi≤ 10000
#include<bits/stdc++.h> using namespace std; const int N = 4e3 + 7; int dp[N], v[N], n, k, w; int main() { cin >> n >> k >> w; memset(dp, 0xcf, sizeof(dp)); for (int i = 0; i < n; i++) cin >> v[i]; for (int i = 1; i < n; i++) v[i] -= v[0]; w -= k; dp[0] = 0; for (int i = 1; i < n; i++) { for (int j = i; j <= w; j++) { dp[j] = max(dp[j], dp[j - i] + v[i]); } } cout << dp[w] + k * v[0] << endl; return 0; }

浙公网安备 33010602011771号