神奇的口袋(背包问题)
05 神奇的口袋(背包问题)
描述
有一个神奇的口袋,总的容积是40,用这个口袋可以变出一些物品,这些物品的总体积必须是40。John现在有n个想要得到的物品,每个物品的体积分别是a1,a2……an。John可以从这些物品中选择一些,如果选出的物体的总体积是40,那么利用这个神奇的口袋,John就可以得到这些物品。现在的问题是,John有多少种不同的选择物品的方式。
输入
输入的第一行是正整数n (1 <= n <= 20),表示不同的物品的数目。接下来的n行,每行有一个1到40之间的正整数,分别给出a1,a2……an的值。
输出
输出不同的选择物品的方式的数目。
样例输入
3
20
20
20
样例输出
3
分析
把问题分解为:在v的空间中正好装下前n个物品的个数, f ( v , n ) f(v,n) f(v,n);
递推公式为: f ( v , n ) = f ( v − v o l u m e [ n ] , n − 1 ) + f ( v , n − 1 ) f(v,n)=f(v-volume[n],n-1)+f(v,n-1) f(v,n)=f(v−volume[n],n−1)+f(v,n−1),表示包括n、不包括n的两种情况
//简单递归算法
int f(int w, int v)//f表示用前w个物品,凑空间v的凑法
{if (v == 0)return 1;//如果v=0,说明我已经调好了,这就是一种挑法,即不选任何东西,返回1if (w < 0)return 0;//进行到这里说明v!=0,而此时没有东西给我选了,这种做法不行return f(w-1, v) + f(w-1, v - volume[w]);//不选第w个物品和选第w个物品的做法之和就是结果
}//动归的递归形式
int f(int w, int v)//f表示用前w个物品,凑空间v的凑法
{if (w < 0 || v < 0)return 0;//进行到这里说明v!=0,而此时没有东西给我选了,这种做法不行if (v == 0){results[w][v] = 1;return 1;//如果v=0,说明我已经调好了,这就是一种挑法,即不调,返回1}//注意这里没有把这个递归出口前置,是因为可能出现volume<0的情况,此时访问会出现bugif (results[w][v] != 0)return results[w][v];results[w][v] = f(w - 1, v) + f(w - 1, v - volume[w]);return results[w][v];//不选第w个物品和选第w个物品的做法之和就是结果
}
神奇的口袋(背包问题)相关推荐
- Codeup-2044:神奇的口袋
题目描述 有一个神奇的口袋,总的容积是40,用这个口袋可以变出一些物品,这些物品的总体积必须是40.John现在有n个想要得到的物品,每个物品的体积分别是a1,a2--an.John可以从这些物品中选 ...
- 递归设计--八皇后+神奇的口袋+数列+吃糖果
2019.01.26 是日晴朗,纪念下放假以来第一次9点起,最近怎么越活越回去呢,别再患得患失啦,过好当下就行哟~ 本文主要是递归设计练习的总结,包含以下内容(难度依次递减) 八皇后(N皇后):全排列 ...
- 动态规划之神奇的口袋问题
问题描述 有一个神奇的口袋,总的容积是40,用这个口袋可以变出一些物品,这些物品的总体积必须是40 John现在有n(1<=n<=20)个想要得到的物品,每个物品的体积分别是a1,a2,- ...
- 程序设计与算法----递归之神奇的口袋
问题描述 问题描述 有一个神奇的口袋,总的容积是40,用这个口袋可以变出一些物品,这些物品的总体积必须是40 John现在有n(1<=n<=20)个想要得到的物品,每个物品的体积分别是a1 ...
- Bailian2759 神奇的口袋(2)【DP】
2759:神奇的口袋(2) 总时间限制: 1000ms 内存限制: 65536kB 描述 有一个神奇的口袋,总的容积是400,用这个口袋可以变出一些物品,这些物品的总体积必须是400.John现在有n ...
- 北大培训课动态规划----神奇的口袋(百练2755)
北京大学暑期课<ACM/ICPC竞赛训练> ppt摘取 什么是动态规划? ●递归到动规的一般转化方法 递归函数有n个参数,就定义一个n维的数组,数组 的下标是递归函数参数的取值范围,数组 ...
- 动态规划之神奇的口袋
动态规划之神奇的口袋 题目 有一个神奇的口袋,总的容积是40,用这个口袋可以变出一些物品,这些物品的总体积必须是40. John现在有n(1≤n ≤ 20)个想要得到的物品,每个物品的体积分别是a1, ...
- 神奇的口袋(动态规划)--算法学习
问题描述 有一个神奇的口袋,总的容积是40,用这个口袋可以变出 一些物品,这些物品的总体积必须是40. John现在有n(1≤n ≤ 20)个想要得到的物品,每个物品 的体积分别是a1,a2--a ...
- 神奇的口袋——Java
题目描述: 有一个神奇的口袋,总的容积是40,用这个口袋可以变出一些物品,这些物品的总体积必须是40.John现在有n个想要得到的物品,每个物品的体积分别是a1,a2--an.John可以从这些物品中 ...
最新文章
- 白话Elasticsearch49-深入聚合数据分析之 Percentile Ranks Aggregation-percentiles rank以及网站访问时延SLA统计
- Windows 系统管理
- Bali BaloCSS天才
- mysql 命令 kill_MySQL之死锁检测
- 山东大学 2020级数据库系统 实验一
- 问题 J: 输出是m的倍数或n的倍数、但不是m和n的公倍数的数
- Java(37)_FlowLayout布局一
- 论文笔记_S2D.02-2013-CVPR-结合三维场景重建和类别分割
- 世界计算机组装最快记录,国产世界最快超级计算机开机1分钟 地球人算32年
- 两个日期区间跨度是否超过一年,开始日期距当前日期是否超过一年——js实现
- 基于SSM+VUE的交通事故案例库系统(前后端分离)
- 居然打不开msi文件?
- 华为服务器修改硬盘显示顺序,服务器硬盘顺序
- What are Triangulation, Trilateration, and Multilateration?
- 地理遥感专业属于计算机行业吗,遥感科学与技术专业怎么样?
- 计算机远程桌面在哪里打开,电脑开启远程桌面的方法
- (转)MTK之Flash篇一
- Sentinel 流控(限流)
- APS实现的要点与难点
- vsto 判断是否安装插件