您的位置:首页 > 其它

背包问题的变形

2015-01-04 20:44 183 查看
今天tyvj抽了,做不了题目了,明天工数考试,还有几天就能回家了!

发两道最近做的背包的变形题吧,都不是很难的题目。




描述

一个特别的单行街道在每公里处有一个汽车站。顾客根据他们乘坐汽车的公里使来付费。例如样例的第一行就是一个费用的单子。

没有一辆车子行驶超过10公里,一个顾客打算行驶n公里(1<=n<=100),它可以通过无限次的换车来完成旅程。最后要求费用最少。


输入格式

第一行十个整数分别表示行走1到10公里的费用(<=500)。注意这些数并无实际的经济意义,即行驶10公里费用可能比行驶一公里少。

第二行一个整数n表示,旅客的总路程数。


输出格式

仅一个整数表示最少费用。


测试样例1


输入

12 21 31 40 49 58 69 79 90 101

15


输出

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


输入

24

6

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;
}


就这样吧~预祝自己工数大捷! 话说在个妹子这么少的工科学校果然是容易心情低落啊!!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: