养猪-DP

Description

你有一个猪圈,有N只猪,每天你最多可以杀一只猪卖钱,获益就是猪的体重,但是每过一天每只猪的体重都会下降Pi,问K天内你的最大获利。

Input

第一行两个数N,K;
第二行N个数表示猪的初始重量A[i];
第三行N个数表示P[i]。

Output

输出仅一行为一个数表示最大获利。

Sample Input

2 2
10 10
1 2

Sample Output

19


思路

按照p排序,后01背包


代码

#include <iostream>
#include <algorithm>
#include <cstdio>
using namespace std;
int n,k,f[100005];
struct fdfdfd{int a,p;}a[100005];
bool cmp(fdfdfd a,fdfdfd b){return (a.p==b.p&&a.a<b.a)||(a.p>b.p);}
int main()
{
	scanf("%d%d",&n,&k);
	for(int i=1;i<=n;i++) scanf("%d",&a[i].a);
	for(int i=1;i<=n;i++) scanf("%d",&a[i].p);
	sort(a+1,a+n+1,cmp);
	for(int i=1;i<=n;i++)
		for(int j=max(i,k);j>=1;j--)
			f[j]=max(f[j],f[j-1]+max(a[i].a-a[i].p*(j-1),0));
	int ans=f[1];
	for(int i=1;i<=k;i++) ans=max(ans,f[i]);
	printf("%d",ans);
	return 0;
}
原文地址:https://www.cnblogs.com/wuwendongxi/p/13225847.html