博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[BJOI2019]排兵布阵——分组背包
阅读量:7097 次
发布时间:2019-06-28

本文共 993 字,大约阅读时间需要 3 分钟。

题目链接:

 

对于每座堡垒,将$s$个对手排序,显然如果安排的兵力能打败第$i$个对手就一定能打败前$i-1$个。

那么对于第$i$座城堡,可以看做有$s+1$个物品(可以不安排兵力),第$j$个物品代价为$2*v[j]+1$,收益为$i*j$。

剩下的只需要将每座城堡的所有物品放在一组然后分组背包即可。

#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
using namespace std;int f[120][20010];int cnt[120];int g[120][120];int h[120][120];int s[120];int mp[120][120];int n,m,k;int main(){ scanf("%d%d%d",&k,&n,&m); for(int i=1;i<=k;i++) { for(int j=1;j<=n;j++) { scanf("%d",&mp[i][j]); } } for(int i=1;i<=n;i++) { for(int j=1;j<=k;j++) { s[j]=mp[j][i]; } sort(s+1,s+1+k); for(int j=1;j<=k;j++) { if(2*s[j]+1<=m) { g[i][++cnt[i]]=2*s[j]+1; h[i][cnt[i]]=i*j; } } } for(int i=1;i<=n;i++) { for(int j=0;j<=m;j++) { for(int k=0;k<=cnt[i];k++) { if(j>=g[i][k]) { f[i][j]=max(f[i][j],f[i-1][j-g[i][k]]+h[i][k]); } } } } printf("%d",f[n][m]);}

转载于:https://www.cnblogs.com/Khada-Jhin/p/10772297.html

你可能感兴趣的文章
第四节:教你如何快速让浏览器兼容ES6特性
查看>>
C#使用IrisSkin2.dll美化WinForm程序界面
查看>>
Appium移动自动化测试(四)--one demo
查看>>
nginx配置location总结及rewrite规则写法
查看>>
python 登陆接口
查看>>
RedHat7 部署ELK日志分析系统
查看>>
DS实验题 Missile
查看>>
微信上 网页图片点击全屏放大
查看>>
jquery获取css颜色值返回RGB应用
查看>>
(void __user *)arg 中__user的作用
查看>>
APACHE REWRITE ? 匹配问号的写法
查看>>
如何跳出页面的Frame框架
查看>>
Redefine:Change in the Changing World
查看>>
POJ 3436 ACM Computer Factory 最大流
查看>>
atitit。全局变量的设计与实现 java php的异同
查看>>
自己定义控件-画板,橡皮擦,刮刮乐
查看>>
spark 按照key 分组 然后统计每个key对应的最大、最小、平均值思路——使用groupby,或者reduceby...
查看>>
顺序表示的线性表——顺序表
查看>>
categorys源码
查看>>
果粉们注意:Mac误删的照片也能恢复
查看>>