1. 程式人生 > >洛谷P2113 看球泡妹子

洛谷P2113 看球泡妹子

DP神題

思路清奇 我直接不管妹子,騙了90分,(滑稽

思路

我們定義f[i][j][k]f[i][j][k]表示選到了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; }