洛谷P2113 看球泡妹子
阿新 • • 發佈:2018-12-14
DP神題
思路清奇
我直接不管妹子,騙了90分,(滑稽
思路
我們定義表示選到了i場比賽,第i場比賽要看第j場比賽 ,妹子的滿意度是k時,他能得到的最大滿意度,然後跑個類似揹包的東西就好了,出題人真是喪病良心啊
程式碼
//By AcerMo
#include<cmath>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
int n,m,k, c;
int f[105][105][2005];
int a[105],b[105],v1[105],v2[105];
signed main()
{
scanf("%d%d%d%d",&n,&m,&k,&c);
for (int i=1;i<=n;i++) scanf("%d",&a[i]);
for (int i=1;i<=n;i++) scanf("%d",&b[i]);
for (int i=1;i<=m;i++)
{
int x,y;scanf("%d%d",&x,&y);
v1[i]=a[x]*a[ y];v2[i]=b[x]+b[y];
}
int ans=0;
for (int i=1;i<=k;i++)
for (int j=i;j<=m;j++)
for (int e=20*m;e;e--)
{
f[i][j][e]=max(f[i][j][e],f[i][j-1][e]);
if (e>=v2[j]&&(f[i-1][j-1][e-v2[j]]>0||e==v2[j]))
f[i][j][e]=max(f[i][j][e],f[i-1][j-1][e-v2[j]]+v1[j]);
if (e>=c) ans=max (ans,f[i][j][e]);
}
if (ans==0) puts("-1");
else cout<<ans;
return 0;
}