hdu 1171 - Big Event in HDU(完全背包)
来源:互联网 发布:js获取手机当前位置 编辑:程序博客网 时间:2024/06/06 19:34
地址
http://acm.hdu.edu.cn/showproblem.php?pid=1171
定位
动态规划
完全背包问题
大数组
分析
AB两学院分配一个总价值为
W 的物品集, 要求各自分得的物品价值尽量接近, 且A≤B 。对于B学院, 等价于背包容量为
W2 的完全背包问题。题中, 分配标准只是价值均分, 对物品种数没有要求, 每种分一半的常规理解不是最佳的, 只关心价值即可。
与典型完全背包问题相比, 有几点不同:
(1) 物品价值同时也是其重量。
(2) 物品数量直接给出, 而不是靠容量约束。
问题规模很大, 设计存储空间时需精打细算。
物品种类
0<N≤50 , 每种数量0<M≤100 , 每种价值0<V≤50 。故, 物品集总价值
0<W≤250000 , 背包容量0<W2≤125000 。int value[51];int num[51];int dp[125001];
鉴于
n=106 的问题规模, 不论时间复杂度还是空间复杂度都要尽可能优化。(1) 按照0-1背包的思路求解, 相当于有
∑mi 种物品, 时间复杂度为O(NW∑mi) 。按照完全背包优化的思路求解, 时间复杂度为O(NW) 。选择后者。
(2) 存储空间为一维数组, 尽量减少空间复杂度。
代码
#include <stdio.h>#include <stdlib.h>int value[51];int num[51];int dp[125001];int main(){ int N,V,W; int i,j,tmp; scanf("%d*c",&N); while(N > 0) { memset(value,0,sizeof(value)); memset(value,0,sizeof(num)); memset(dp,0,sizeof(dp)); V = 0; for(i=1;i<=N;i++) { scanf("%d %d*c",&value[i],&num[i]); V += value[i] * num[i]; } W = V / 2; for(i=1;i<=N;i++) { for(j=value[i];j<=W;j++) { tmp = dp[j-value[i]] + value[i]; if((tmp-dp[j])/value[i] <= num[i] && tmp > dp[j]) { dp[j] = tmp; } else { dp[j] = dp[j-1] > dp[j] ? dp[j-1] : dp[j]; } } } printf("%d %d\n",V - dp[W],dp[W]); scanf("%d*c",&N); } return 0;}
性能
总结
考虑到本题规模, 采用背包思路求解本身就比较勉强, 另一种解题思虑是母函数, 容稍后尝试。
Ver 2.0 2017-2-18
0 0
- hdu 1171 Big Event in HDU(完全背包)
- hdu 1171 - Big Event in HDU(完全背包)
- Big Event in HDU+完全背包问题
- [HDU 1171 Big Event in HDU]背包
- 1171 Big Event in HDU【背包】
- Big Event in HDU 背包
- hdu 1171 Big Event in HDU(01背包&多重背包)
- 杭电-1171 Big Event in HDU(完全背包转换01背包)
- HDU Big Event in HDU - 多重背包
- hdu 1171多重背包Big Event in HDU
- hdu 1171 Big Event in HDU 多重背包
- hdu 1171 Big Event in HDU(多重背包可行性)
- hdu 1171 Big Event in HDU 01背包
- HDU 1171 Big Event in HDU(多重背包)
- Hdu 1171 Big Event in HDU (多重背包)
- HDU 1171 Big Event in HDU(多重背包)
- hdu 1171 Big Event in HDU(多重背包)
- hdu 1171 Big Event in HDU 多重背包基础题
- BZOJ 1150 数据备份Backup 【贪心】【堆】
- JAVA基础补完之并发编程
- 一种基于中断的按键检测方法
- C 练习实例61 - 杨辉三角形,二维数组,未美化
- git常用命令
- hdu 1171 - Big Event in HDU(完全背包)
- GC日志分析
- mysql求排序后前几名(包含并情况)
- python 使用-读取文件、替换文件中指定的内容
- HDU - 3533 bfs [kuangbin带你飞]专题二
- 使用CountDownTimer达到倒计时效果(可做短信验证码倒计时)
- 移动端常见meta设置
- static final,static,final
- 【JavaScript】JavaScript简介