HDU 1171 Big Event in HDU 杭电大事件(母函数,有限物品)
2024-10-21 05:41:09
题意:
分家问题,对每种家具都估个值,给出同样价值的家具有多少个,要求尽可能平分,打印的第一个数要大于等于第二个数。
思路:
可以用背包做,也可以用母函数。母函数的实现只需要注意一个点,就是每次以一种价格递增,而不是自加。每类家具有上限,就是该类家具的价值*件数。注意判断输入的结束标志是n<0。
#include <bits/stdc++.h>
using namespace std;
const int N=;
int tmp[**/], ans[**/], big; //上限是50*50*100,但一半就够了
int v[], m[]; int cal(int n) //返回第二个学院所得资产
{
memset(ans,,sizeof(ans));
int half=(big>>);//求一半以下就行,多了也没用
for(int i=,t=; i<=half&&t<=m[]; t++,i+=v[] ) ans[i]=;
for(int i=; i<n; i++)
{
memset(tmp,,sizeof(int)*(half+));
for(int k=; k<=half; k++)
for(int j=,t=; t<=m[i]&&j+k<=half; t++,j+=v[i] )
tmp[j+k]+=ans[k];
memcpy(ans,tmp,sizeof(int)*(half+));
}
for(int i=half; i>; i--)
if(ans[i]) return i;
return ;
} int main()
{
//freopen("input.txt", "r", stdin);
int n, a, b;
while(scanf("%d",&n), n>)//这个判断结束要注意
{
big=;
for(int i=; i<n; i++)
{
scanf("%d%d",&v[i],&m[i]);
big+=v[i]*m[i];
}
int tmp=cal(n);
printf("%d %d\n",big-tmp,tmp);
}
return ;
}
AC代码
最新文章
- 机器学习技法-GBDT算法
- CentOS 6 下RPM方式安装MySQL5.6
- 【bzoj1011】[HNOI2008]遥远的行星
- zoj 1967 Fiber Network/poj 2570
- c#中用DirectShow实现媒体播放器的核心(1) DirectShow简介
- 用ISE14.7引用功能强大的UltraEdit编写Verilog
- 属性动画(Property Animation)资源
- Android利用网络编程HttpClient批量上传(两)AsyncTask+HttpClient监测进展情况,并上传
- 剖析touch事件在View中的传递
- 当使用composer安装组件时提示错误
- QT的radioButton组的使用
- DSAPI 调用串口选择界面
- w3m 使用总结
- echarts 去掉 x轴坐标
- NoSql图形数据库
- RestExpress response中addHeader 导致stackOverflow
- SpringMVC异常处理器
- SpringBoot Laravel(artisan serve) MIXPHP简单性能测试
- vue pros 子组件接收父组件传递的值
- Oracle Telnet 1521 失败