背包问题
2015-09-24 15:42
232 查看
1. 01背包
问题描述:
小Ho现在手上有M张奖券,而奖品区有N件奖品,分别标号为1到N,其中第i件奖品需要need(i)张奖券进行兑换,同时也只能兑换一次。为了使得辛苦得到的奖券不白白浪费,小Ho给每件奖品都评了分,其中第i件奖品的评分值为value(i),表示他对这件奖品的喜好值。现在他想知道,凭借他手上的这些奖券,可以换到哪些奖品,使得这些奖品的喜好值之和能够最大。
2. 完全背包
问题描述:
小Ho现在手上有M张奖券,而奖品区有N种奖品,分别标号为1到N,其中第i种奖品需要need(i)张奖券进行兑换,并且可以兑换无数次,为了使得辛苦得到的奖券不白白浪费,小Ho给每件奖品都评了分,其中第i件奖品的评分值为value(i),表示他对这件奖品的喜好值。现在他想知道,凭借他手上的这些奖券,可以换到哪些奖品,使得这些奖品的喜好值之和能够最大。
问题描述:
小Ho现在手上有M张奖券,而奖品区有N件奖品,分别标号为1到N,其中第i件奖品需要need(i)张奖券进行兑换,同时也只能兑换一次。为了使得辛苦得到的奖券不白白浪费,小Ho给每件奖品都评了分,其中第i件奖品的评分值为value(i),表示他对这件奖品的喜好值。现在他想知道,凭借他手上的这些奖券,可以换到哪些奖品,使得这些奖品的喜好值之和能够最大。
#include<stdio.h> #include<string.h> #define M 100005 int V[M]; int main() { int n, m, need, value, i, j; scanf("%d%d", &n, &m); for (i = 0; i < n; i++) { scanf("%d%d", &need, &value); for (j = m; j >= need; j--) //逆向 { if (V[j - need] + value>V[j]) V[j] = V[j - need] + value; } } printf("%d\n", V[m]); return 0; }
2. 完全背包
问题描述:
小Ho现在手上有M张奖券,而奖品区有N种奖品,分别标号为1到N,其中第i种奖品需要need(i)张奖券进行兑换,并且可以兑换无数次,为了使得辛苦得到的奖券不白白浪费,小Ho给每件奖品都评了分,其中第i件奖品的评分值为value(i),表示他对这件奖品的喜好值。现在他想知道,凭借他手上的这些奖券,可以换到哪些奖品,使得这些奖品的喜好值之和能够最大。
#include<stdio.h> #include<string.h> #define M 100005 int V[M]; int main() { int n, m, need, value, i, j; scanf("%d%d", &n, &m); for (i = 0; i < n; i++) { scanf("%d%d", &need, &value); for (j = need; j <=m; j++) //正向 { if (V[j - need] + value>V[j]) V[j] = V[j - need] + value; } } printf("%d\n", V[m]); return 0; }
相关文章推荐
- apache不记录指定格式元素的日志
- sed与awk命令小结
- mysql中的多行查询结果合并成一个
- leetcode283
- HDU 1011 Starship Troopers(树形背包)
- MySQL必知必会笔记(二)SELECT语句 检索 排序 过滤 通配符搜索 正则表达式搜索
- Android的ViewAnimator而它的子类ViewSwitcher-android学习之旅(三十三)
- angularJS中如何写控制器
- poj_1743 后缀数组
- Seek the Name, Seek the Fame---poj2752(kmp中的Next数组)
- Java输入输出流
- Dialogfragment的使用
- Mac OS X 启用 Web 服务器
- 面试大全
- 在PCB中删除元件
- 文章标题
- 谷歌/微软/必应web页面免费翻译插件
- ViewDragHelper学习之九宫格拼图
- 苹果有毒!APP安全何在?
- 多次页面跳转后pop回主界面的问题