P2663 越越的组队
2024-09-05 05:18:37
原题链接 https://www.luogu.org/problem/P2663
很容易看出来是个背包问题嘛:
体积是总分的一半,求最高分,每个同学选或不选,是个 01背包问题。
自信地交上去之后发现只有 90pts ,为什么呢?
是不是忘了个条件啊喂,人家还要选 n/2 个人呐!
多一个条件就加一个维度。——zhx
有了第二个限制:重量是 n/2 ,这样就从一个 01背包问题转化成了二维背包问题,我们只需在 for 循环中多枚举一层 1~n/2 问题就搞定了。
上AC代码:
#include<iostream>
#include<cstdio>
using namespace std;
int read()
{
char ch=getchar();
int a=,x=;
while(ch<''||ch>'')
{
if(ch=='-') x=-x;
ch=getchar();
}
while(ch>=''&&ch<='')
{
a=(a<<)+(a<<)+(ch-'');
ch=getchar();
}
return a*x;
}
long long n,sum;
long long test[];
long long f[][]; //f[i][j]:选了i个人总分不超过j的最大分数
int main()
{
n=read();
for(int i=;i<=n;i++)
{
test[i]=read(); //每个人的分数
sum+=test[i]; //总分
}
for(int k=;k<=n;k++) //枚举每个人
{
for(int i=n/;i>=;i--) //限制人数的这个条件(重量)
{
for(int j=sum;j>=test[k];j--) //限制分数的这个条件(体积)
{
f[i][j]=max(f[i][j],f[i-][j-test[k]]+test[k]); //选或不选取max
}
}
}
printf("%lld",f[n/][sum/]);
return ;
}
最新文章
- 【JUC】JDK1.8源码分析之ConcurrentSkipListSet(八)
- jQuery实现Checkbox中项目开发全选全不选的使用
- convert from base 10 to base 2
- 51nod1406 与查询
- Scrambled Polygon - POJ 2007(求凸包)
- OTG中的ID脚风波释疑
- VSTO学习笔记(十四)Excel数据透视表与PowerPivot
- UVa 11408 - Count DePrimes
- lucene两个分页操作
- .net设计模式之装饰模式
- FusionCharts for Flex的属性和事件
- Linux安装Gradle
- GiBbook实用配置以及插件
- 车载文档记录(ROM)
- 20155232《网络对抗》Exp4 恶意代码分析
- 【最大流之ek算法】HDU1532 求最大流
- CodeIgniter Doctrine2基本使用(二)(转)
- P3871 [TJOI2010]中位数
- SQL注入备忘录
- 从零开始学JavaScript一(简介)