背包问题的变形
2015-01-04 20:44
183 查看
今天tyvj抽了,做不了题目了,明天工数考试,还有几天就能回家了!
发两道最近做的背包的变形题吧,都不是很难的题目。
一
一个特别的单行街道在每公里处有一个汽车站。顾客根据他们乘坐汽车的公里使来付费。例如样例的第一行就是一个费用的单子。
没有一辆车子行驶超过10公里,一个顾客打算行驶n公里(1<=n<=100),它可以通过无限次的换车来完成旅程。最后要求费用最少。
第一行十个整数分别表示行走1到10公里的费用(<=500)。注意这些数并无实际的经济意义,即行驶10公里费用可能比行驶一公里少。
第二行一个整数n表示,旅客的总路程数。
仅一个整数表示最少费用。
12 21 31 40 49 58 69 79 90 101
15
147
也就是有10个物品 消耗的公路数分别是1到10 然后有各自的价值 问恰好装满背包(恰好走完全部路程)所得到的最小价值(即最小的金钱花费)
因为每种车都可以无限次的搭乘,所以是完全背包(注意循环顺序是从前向后了。。)
P.S. 这题及其无聊,完全不符合现实,现实中如果坐过了N公里,也应该算是完成了这N公里的旅程(个人理解),那么背包就有超的可能了。但是本题根本不用考虑这么多。
代码如下:
二
有一个箱子容量为v(正整数,o≤v≤20000),同时有n个物品(o≤n≤30),每个物品有一个体积 (正整数)。要求从 n 个物品中,任取若干个装入箱内,使箱子的剩余空间为最小。
第一行,一个整数,表示箱子容量;
第二行,一个整数,表示有n个物品;
接下来n行,分别表示这n个物品的各自体积。
一个整数,表示箱子剩余空间。
24
6
8
3
12
7
9
7
0
要求剩余的空间最少,也就是装的物体所占的体积之和最大,若把各个物体的体积也看成它们的价值,就是简单的01背包问题
代码如下:
就这样吧~预祝自己工数大捷! 话说在个妹子这么少的工科学校果然是容易心情低落啊!!
发两道最近做的背包的变形题吧,都不是很难的题目。
一
描述
一个特别的单行街道在每公里处有一个汽车站。顾客根据他们乘坐汽车的公里使来付费。例如样例的第一行就是一个费用的单子。没有一辆车子行驶超过10公里,一个顾客打算行驶n公里(1<=n<=100),它可以通过无限次的换车来完成旅程。最后要求费用最少。
输入格式
第一行十个整数分别表示行走1到10公里的费用(<=500)。注意这些数并无实际的经济意义,即行驶10公里费用可能比行驶一公里少。第二行一个整数n表示,旅客的总路程数。
输出格式
仅一个整数表示最少费用。
测试样例1
输入
12 21 31 40 49 58 69 79 90 10115
输出
147也就是有10个物品 消耗的公路数分别是1到10 然后有各自的价值 问恰好装满背包(恰好走完全部路程)所得到的最小价值(即最小的金钱花费)
因为每种车都可以无限次的搭乘,所以是完全背包(注意循环顺序是从前向后了。。)
P.S. 这题及其无聊,完全不符合现实,现实中如果坐过了N公里,也应该算是完成了这N公里的旅程(个人理解),那么背包就有超的可能了。但是本题根本不用考虑这么多。
代码如下:
#include <cstdio> #include <cstring> #include <iostream> using namespace std; int bag[111]={0},fee[11]; int main() { int N; memset(bag,1,sizeof(bag)); bag[0]=0; for(int i=1;i<=10;i++) scanf("%d",&fee[i]); scanf("%d",&N); for(int i=1;i<=10;i++) for(int j=i;j<=N;j++) bag[j]=min(bag[j],bag[j-i]+fee[i]); printf("%d\n",bag ); return 0; }
二
描述
有一个箱子容量为v(正整数,o≤v≤20000),同时有n个物品(o≤n≤30),每个物品有一个体积 (正整数)。要求从 n 个物品中,任取若干个装入箱内,使箱子的剩余空间为最小。
输入格式
第一行,一个整数,表示箱子容量;第二行,一个整数,表示有n个物品;
接下来n行,分别表示这n个物品的各自体积。
输出格式
一个整数,表示箱子剩余空间。
测试样例1
输入
246
8
3
12
7
9
7
输出
0要求剩余的空间最少,也就是装的物体所占的体积之和最大,若把各个物体的体积也看成它们的价值,就是简单的01背包问题
代码如下:
#include <cstdio> #include <iostream> using namespace std; int bag[22222]={0},V[22222]; int main() { int n,N; scanf("%d%d",&N,&n); for(int i=1;i<=n;i++) scanf("%d",&V[i]); for(int i=1;i<=n;i++) for(int j=N;j>=V[i];j--) { bag[j]=max(bag[j],bag[j-V[i]]+V[i]); } printf("%d\n",N-bag ); return 0; }
就这样吧~预祝自己工数大捷! 话说在个妹子这么少的工科学校果然是容易心情低落啊!!
相关文章推荐
- poj 1157 LITTLE SHOP OF FLOWERS DP 背包问题变形
- 背包问题及其变形
- P1049装箱问题(背包,变形)
- 又见01背包——南阳理工题库(背包问题变形)
- 完全背包问题变形
- 动态规划——背包问题变形
- 用分支定界的方法求解变形的背包问题(c++版本)
- 分组背包问题Matlab实现——之基本背包变形
- 洛谷P1049 装箱问题(01背包小变形)
- 背包问题及其变形
- poj 2229 完全背包变形(求解整数拆分问题)
- HDU 2955 Robberies(0-1背包问题的简单变形)
- (POJ1376)Cash Machine <多重背包问题变形,二进制优化>
- HDU 1574 RP问题(01背包变形)
- hdu 1284 钱币兑换问题(完全背包 变形---求方案总数)
- POJ 1837:Balance:动态规划_背包问题变形
- 关于变形的背包问题的答案(C版)
- 题目1030:毕业bg(0-1背包问题的变形)
- hdu 5410(背包问题变形)
- 最大报销额(动态规划:01背包问题变形)