700字范文,内容丰富有趣,生活中的好帮手!
700字范文 > 大力出奇迹----旅行背包

大力出奇迹----旅行背包

时间:2021-12-15 09:12:18

相关推荐

大力出奇迹----旅行背包

题目描述

李老师正准备暑假旅行,他有一个容量为L的行李箱和n个物品(n不超过20),每个物品都有自己的体积,物品可以放入行李箱,但行李箱中物品的总体积不能超过行李箱容量,李老师现在想知道他有多少种携带物品的方案(一个物品都不带也算一种方案)

输入数据

第一行为两个正整数n和L,分别代表物品总数和行李箱容量,n<=20,L<=1e9 接下来一行为n个正整数vi,代表第i个物品的体积,vi<=1e8

输出数据

方案数

样例输入

3 10

2 4 5

样例输出

7

思路:

递归的思路,每种物品都有拿或者不拿两种选择,建立一颗完全二叉树

代码:

#include<iostream>#include<math.h>using namespace std;int num = 0;//方案数void Plan(int a[], int id, int volume, int n, int l){if (id == n)//遍历完所有数据{if (volume <= l)//总体积小于等于行李箱的体积num++;return;//结束该函数的调用,否则会继续id+1}Plan(a, id + 1, volume, n, l);//选择不带该物品Plan(a, id + 1, volume + a[id], n, l);//选择带该物品}int main(){int n, l;//物品数和箱子容量cin >> n >> l;int a[20];//物品体积,for (int i = 0; i < n; i++)cin >> a[i];Plan(a, 0, 0, n, l);cout << num << endl;return 0;}

注意事项:

1、没有用类的话,方案数需要定义为全局变量

2、递归结束的条件中需要有return,如果没有的话会继续执行后边的程序,也就是id+1,然而数据已经遍历完毕,因此需要结束上一函数的调用,再返回一层

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。