背包基础题 【 题集 】 更新ing ......
来源:互联网 发布:linux sh 编辑:程序博客网 时间:2024/04/29 06:29
今天重新回去做了一下背包,发现自己,根本不会了已经、、、、
这边的题目,都很基础!!!
1、完全背包 HDU 1114 链接:acm.hdu.edu.cn/showproblem.php?pid=1114
这个就是简单的完全背包,并且是判断恰好装满的那种
//HDU Piggy-Bank 完全背包#include <stdio.h>const int N = 550;int c[N];int w[N];int dp[10010];const int INF = 10000000; //判断是否恰好装满, 这题就这里了int min(int x, int y){return x < y ? x : y ;}int main(){int n, m;int i, j;int a, b;int cc, ww;while(~scanf("%d",&n)){while(n --){ scanf("%d%d", &cc, &ww); scanf("%d", &m); for(i = 0; i <= ww - cc; i ++) dp[i] = INF; for(i = 0; i < m; i ++) scanf("%d%d",&c[i], &w[i]);dp[0] = 0; for(i = 0;i < m; i ++) { for(j = w[i]; j <= ww - cc; j ++) dp[j] = min(dp[j - w[i]] + c[i], dp[j]); } if(dp[ww - cc] == INF) // 这题学会了这个 printf("This is impossible.\n"); else printf("The minimum amount of money in the piggy-bank is %d.\n",dp[ww - cc]); }}return 0;}
2、分组背包 HDU 1712 ACboy needs your help 链接:http://acm.hdu.edu.cn/showproblem.php?pid=1712
就是物品被划分为若干组,每组中的物品互相冲突,最多选一件。求解将哪些物品装入背包可使这些物品的费用总和不超过背包容量,且价值总和最大。
突然发现一个挺好的网页链接,也是关于背包九讲的,可以试试、、 http://love-oriented.com/pack/P06.html 只要改一下P06 中的最后一位数字,就可以看各样的背包解析了。
#include <stdio.h>#include <string.h>#include <algorithm>using namespace std;int dp[110];int tt[110][110];int main(){ int n, m;while(~scanf("%d%d",&n,&m)){if(n == 0 && m == 0) break;memset(dp, 0, sizeof(dp)); for(int i = 1; i <= n; i ++){for(int j = 1; j <= m; j ++)scanf("%d",&tt[i][j]);}for(int i = 1; i <= n; i ++){for(int j = m; j>= 0; j --){for(int k = 1; k <= j; k ++) dp[j] = max(dp[j], dp[j - k] + tt[i][k]);}}printf("%d\n",dp[m]);}return 0;}做完可以看一看HDU 3033
3、 01背包 HDU 2602 Bone Collector http://acm.hdu.edu.cn/showproblem.php?pid=2602
#include <stdio.h>#include <string.h>#include <math.h>#include <queue>#include <algorithm>using namespace std;int t;int n, m;int dp[1010];int v[1010];int w[1010];int main(){ while(~scanf("%d",&t)) { while(t --) { memset(dp, 0, sizeof(dp)); memset(v, 0, sizeof(v)); memset(w, 0, sizeof(w)); scanf("%d%d",&n, &m); for(int i = 0; i < n; i ++) scanf("%d",&w[i]); for(int i = 0; i < n; i ++) scanf("%d",&v[i]); for(int i = 0; i < n; i ++) { for(int j = m; j - v[i] >= 0; j --) { dp[j] = max(dp[j], dp[j - v[i]] + w[i]); } } printf("%d\n",dp[m]); } } return 0;}
0 0
- 背包基础题 【 题集 】 更新ing ......
- linux基础学习笔记(持续更新ING)
- 树状数组 【 题集 】 更新 ing...
- 【 题集 】 字典树 更新 ing......
- 初出茅庐 【 题集 】 (一) 更新 ing ......
- 【 题集 】 CF #277.5 (Div. 2) 更新ing...
- linux常用命令(更新ing......)
- latex 笔记,更新ing
- 思想 - 回溯 更新 ing...
- 背包专辑-基础篇(持续更新中)
- 【 题集 】 第五届河南ACM省赛 更新ing......
- 程序员笔试面试常见题总结,更新ing
- HTML基础 学习ing
- 树形背包基础题
- 人生经典语句(更新ing....)
- linux学习资料,更新ing
- jQuery 学习(更新ing)
- 认识计算机网络(更新ing)
- 选择软文发布需要注意的问题
- HDU 1702 ACboy needs your help again! 栈和队列的使用
- ajax请求Struts2返回xml数据方法
- MAC地址格式小结
- 单幅图像基于暗通道的图像去雾
- 背包基础题 【 题集 】 更新ing ......
- 《Effective C++ 》学习笔记——条款01
- HDU 1022 Train Problem I 栈的模拟
- [USACO 2014 Feb Silver]scode
- IOS学习---OC基础学习2
- HDU 1237 简单计算器 表达式求值
- ZJU2949 Coins of Luck - 数学期望
- C++回调函数(callback)与仿函数(functor)的异同
- Beautiful String-连续字符串