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个物品的做法之和就是结果
}

神奇的口袋(背包问题)相关推荐

  1. Codeup-2044:神奇的口袋

    题目描述 有一个神奇的口袋,总的容积是40,用这个口袋可以变出一些物品,这些物品的总体积必须是40.John现在有n个想要得到的物品,每个物品的体积分别是a1,a2--an.John可以从这些物品中选 ...

  2. 递归设计--八皇后+神奇的口袋+数列+吃糖果

    2019.01.26 是日晴朗,纪念下放假以来第一次9点起,最近怎么越活越回去呢,别再患得患失啦,过好当下就行哟~ 本文主要是递归设计练习的总结,包含以下内容(难度依次递减) 八皇后(N皇后):全排列 ...

  3. 动态规划之神奇的口袋问题

    问题描述 有一个神奇的口袋,总的容积是40,用这个口袋可以变出一些物品,这些物品的总体积必须是40 John现在有n(1<=n<=20)个想要得到的物品,每个物品的体积分别是a1,a2,- ...

  4. 程序设计与算法----递归之神奇的口袋

    问题描述 问题描述 有一个神奇的口袋,总的容积是40,用这个口袋可以变出一些物品,这些物品的总体积必须是40 John现在有n(1<=n<=20)个想要得到的物品,每个物品的体积分别是a1 ...

  5. Bailian2759 神奇的口袋(2)【DP】

    2759:神奇的口袋(2) 总时间限制: 1000ms 内存限制: 65536kB 描述 有一个神奇的口袋,总的容积是400,用这个口袋可以变出一些物品,这些物品的总体积必须是400.John现在有n ...

  6. 北大培训课动态规划----神奇的口袋(百练2755)

    北京大学暑期课<ACM/ICPC竞赛训练> ppt摘取 什么是动态规划? ●递归到动规的一般转化方法  递归函数有n个参数,就定义一个n维的数组,数组 的下标是递归函数参数的取值范围,数组 ...

  7. 动态规划之神奇的口袋

    动态规划之神奇的口袋 题目 有一个神奇的口袋,总的容积是40,用这个口袋可以变出一些物品,这些物品的总体积必须是40. John现在有n(1≤n ≤ 20)个想要得到的物品,每个物品的体积分别是a1, ...

  8. 神奇的口袋(动态规划)--算法学习

    问题描述 有一个神奇的口袋,总的容积是40,用这个口袋可以变出 一些物品,这些物品的总体积必须是40.  John现在有n(1≤n ≤ 20)个想要得到的物品,每个物品 的体积分别是a1,a2--a ...

  9. 神奇的口袋——Java

    题目描述: 有一个神奇的口袋,总的容积是40,用这个口袋可以变出一些物品,这些物品的总体积必须是40.John现在有n个想要得到的物品,每个物品的体积分别是a1,a2--an.John可以从这些物品中 ...

最新文章

  1. 白话Elasticsearch49-深入聚合数据分析之 Percentile Ranks Aggregation-percentiles rank以及网站访问时延SLA统计
  2. Windows 系统管理
  3. Bali BaloCSS天才
  4. mysql 命令 kill_MySQL之死锁检测
  5. 山东大学 2020级数据库系统 实验一
  6. 问题 J: 输出是m的倍数或n的倍数、但不是m和n的公倍数的数
  7. Java(37)_FlowLayout布局一
  8. 论文笔记_S2D.02-2013-CVPR-结合三维场景重建和类别分割
  9. 世界计算机组装最快记录,国产世界最快超级计算机开机1分钟 地球人算32年
  10. 两个日期区间跨度是否超过一年,开始日期距当前日期是否超过一年——js实现
  11. 基于SSM+VUE的交通事故案例库系统(前后端分离)
  12. 居然打不开msi文件?
  13. 华为服务器修改硬盘显示顺序,服务器硬盘顺序
  14. What are Triangulation, Trilateration, and Multilateration?
  15. 地理遥感专业属于计算机行业吗,遥感科学与技术专业怎么样?
  16. 计算机远程桌面在哪里打开,电脑开启远程桌面的方法
  17. (转)MTK之Flash篇一
  18. Sentinel 流控(限流)
  19. APS实现的要点与难点
  20. vsto 判断是否安装插件

热门文章

  1. 数据库系统丨关系代数运算总结
  2. 升华网第四次培训心得
  3. 配置双系统开机选择系统的倒计时
  4. pandas学习笔记:某一列字符类型转换为离散的数值标签;将某一列数值类型转换成独热码
  5. Android 笔记:识别银行卡,获取银行卡卡号
  6. oracle oaf环配置境,配置Oracle ebs的oaf开发环境的操作步骤
  7. python两个文件内容异或,python 异或两个文件
  8. C语言命令行参数详解
  9. Android 之 动画合集之属性动画 -- 又见
  10. MySQL插入中文字符