• 背包DP【洛谷P2113】 看球泡妹子


    P2113 看球泡妹子

    题目背景

    2014年巴西世界杯开幕了,现在满城皆是世界杯,商家们利用它大赚一笔,小明和小红也借此机会增进感情。

    题目描述

    本届世界杯共有N支球队,M场比赛。男球迷小明喜欢看比赛,女球迷小红喜欢看帅哥。每支球队在小明眼里的实力值为Ai,在小红眼里的帅哥数量为Bi。

    每场比赛有两个球队对抗,它们的编号分别是Pi和Qi。小明认为一场比赛的精彩度等于两队实力的乘积,小红则认为是两队帅哥数量之和。

    由于体力的限制,他们最多只能看K场比赛。当然,只要看比赛,两个人一定会一起看。小明作为男生,理应迁就一下女生,所以,请你写一个程序,求出小红看到比赛的精彩度总和不小于C的情况下,小明看到比赛的精彩度的最大总和。

    二维背包。

    (f[i][j][k])表示前i场比赛,选择看j场,小红的开心度为k。

    转移

    [f[i][j][k]=max(f[i-1][j][k],f[i-1][j-1][k-p[i]]+q[i]) ]

    第一维可以滚掉,在大于c的范围内枚举答案即可。

    code:

    #include <iostream>
    #include <cstdio>
    #include <cstring>
    
    using namespace std;
    
    const int wx=117;
    
    inline int read(){
    	int sum=0,f=1; char ch=getchar();
    	while(ch<'0'||ch>'9'){if(ch=='-')f=-1; ch=getchar();}
    	while(ch>='0'&&ch<='9'){sum=(sum<<1)+(sum<<3)+ch-'0';ch=getchar();}
    	return sum*f;
    } 
    
    int ans=-1;
    
    int a[wx],b[wx];
    int q[wx],p[wx];
    int f[wx][wx][2007];
    int n,m,K,c,sum;
    
    int main(){
    	n=read(); m=read(); K=read(); c=read();
    	for(int i=1;i<=n;i++) a[i]=read();
    	for(int i=1;i<=n;i++) b[i]=read();
    	for(int i=1;i<=m;i++) {
    		int x,y;
    		x=read(); y=read();
    		p[i]=a[x]*a[y]; q[i]=b[x]+b[y]; sum+=q[i];
    	}
    	memset(f,0xc0,sizeof f);
    	f[0][0][0]=0;
    	for(int i=1;i<=m;i++){
    		for(int j=0;j<=K;j++){
    			for(int k=sum;k>=0;k--)f[i][j][k]=max(f[i-1][j][k],f[i][j][k]);
    			for(int k=sum;k>=0;k--)if(k-q[i]>=0&&j>=1)f[i][j][k]=max(f[i-1][j-1][k-q[i]]+p[i],f[i][j][k]);
    		}
    	}
    	for(int i=c;i<=sum;i++){
    		ans=max(ans,f[m][K][i]);
    	}
    	printf("%d",ans);
    	return 0;
    }
    
  • 相关阅读:
    c读取文本文档
    java类中定义接口
    android selector
    android listview
    android继承Dialog实现自定义对话框
    移植net-snmp到开发板(mini210)
    [BZOJ1901]Zju2112 Dynamic Rankings
    [BZOJ3524][Poi2014]Couriers
    [codeforces722D]Generating Sets
    [codeforces722C]Destroying Array
  • 原文地址:https://www.cnblogs.com/wangxiaodai/p/9811203.html
Copyright © 2020-2023  润新知