养猪-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;
}