列表

详情


NC21186. Rabbit的工作(2)

描述

Rabbit通过了上次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获得的总满意度最大是多少。

示例1

输入:

3 3 5
6 2 4

输出:

16

说明:

Rabbit可以选择分别用1天,1天,3天完成这三个任务,最大满意度为6+6+4=16

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C++14(g++5.4) 解法, 执行用时: 15ms, 内存消耗: 488K, 提交时间: 2019-01-05 13:23:45

#include<bits/stdc++.h>
using namespace std;
const int maxn=4005,inf=1e8;
int d[maxn],a[maxn],n,k,w;
int main()
{
	cin>>n>>k>>w;
	for(int i=0;i<n;i++)
	cin>>a[i];
	for(int i=1;i<=w;i++)d[i]=-inf;
	d[k]=k*a[0];
	for(int i=1;i<n;i++)a[i]-=a[0];
	for(int i=k+1;i<=w;i++)
	for(int j=1;j<min(n,i-j+1);j++)
	d[i]=max(d[i],d[i-j]+a[j]);
	cout<<d[w];
}

C++(clang++ 11.0.1) 解法, 执行用时: 6ms, 内存消耗: 432K, 提交时间: 2022-09-20 10:22:07

#include<bits/stdc++.h>
using namespace std;
int f[10005];
int p[10005];
int main()
{	int n,k,w;
	cin>>n>>k>>w;
		for(int i=0;i<n;i++)
		{	cin>>p[i];
			if(i)
			p[i]-=p[0];
		}
		f[0]=k*p[0];
		for(int i=1;i<=n;i++)
			for(int j=i;j<=w-k;j++)
				f[j]=max(f[j],f[j-i]+p[i]);
				cout<<f[w-k]<<endl;
}

Python3 解法, 执行用时: 1332ms, 内存消耗: 4976K, 提交时间: 2023-08-04 13:59:05

n, k, w = map(int, input().split())
a = list(map(int, input().split()))
dp = [-float('inf')] * (w+1)
dp[0] = 0

for i in range(1, n):
    a[i] -= a[0]

w -= k

for i in range(1, n):
    for j in range(i, w+1):
        dp[j] = max(dp[j-i] + a[i], dp[j])

print(dp[w] + k*a[0])

上一题