1 条题解
-
0
自动搬运
来自洛谷,原作者为

TheGod
None搬运于
2025-08-24 21:34:09,当前版本为作者最后更新于2017-10-23 21:30:35,作者可能在搬运后再次修改,您可在原文处查看最新版自动搬运只会搬运当前题目点赞数最高的题解,您可前往洛谷题解查看更多
以下是正文
(题目名称与背景成功吸引了我)
每两个队伍的比赛可以看做一个重量b[p[i]]+b[q[i]],价值a[p[i]]*a[q[i]]的物品
转化为最多选k次的01背包
dp[i][t][j]表示 已经选i个,本次选到了第t个,小红满意度j时 小明的最大满意度
#include<iostream> #include<cstdio> #include<algorithm> #include<cstring> using namespace std; const int N=110; int p[N],q[N],a[N],b[N],dp[N][N][20*N]; int main(){ int n,m,i,j,t,k,c,ans=0; scanf("%d%d%d%d",&n,&m,&k,&c); for(i=1;i<=n;i++)scanf("%d",&a[i]); for(i=1;i<=n;i++)scanf("%d",&b[i]); for(i=1;i<=m;i++)scanf("%d%d",&p[i],&q[i]); memset(dp,0,sizeof(dp)); for(i=1;i<=k;i++) for(t=i;t<=m;t++) for(j=20*m;j>=0;j--){//Ai<=10,上界2*10*m dp[i][t][j]=max(dp[i][t][j],dp[i][t-1][j]); if(j>=b[p[t]]+b[q[t]]) if(dp[i-1][t-1][j-b[p[t]]-b[q[t]]]>0||j==b[p[t]]+b[q[t]]) //dp[i-1][t-1][j-b[p[t]]-b[q[t]]]的状态可以到达 或者 第一次选 //第一次选的状态也可以在dp前预处理 dp[i][t][j]=max(dp[i][t][j], dp[i-1][t-1][j-b[p[t]]-b[q[t]]]+a[p[t]]*a[q[t]]); if(j>=c)ans=max(ans,dp[i][t][j]);} if(ans>0)cout<<ans<<endl; else cout<<-1<<endl; return 0;}
- 1
信息
- ID
- 1096
- 时间
- 1000ms
- 内存
- 125MiB
- 难度
- 4
- 标签
- 递交数
- 0
- 已通过
- 0
- 上传者