编程题——和为sum的方法数
来源:互联网 发布:linux 鸟哥的私房菜 编辑:程序博客网 时间:2024/06/05 03:47
题目描述
给定一个有n个正整数的数组A和一个整数sum,求选择数组A中部分数字和为sum的方案数。
当两种选取方案有一个数字的下标不一样,我们就认为是不同的组成方案。
当两种选取方案有一个数字的下标不一样,我们就认为是不同的组成方案。
输入描述:
输入为两行:第一行为两个正整数n(1 ≤ n ≤ 1000),sum(1 ≤ sum ≤ 1000)第二行为n个正整数A[i](32位整数),以空格隔开。
输出描述:
输出所求的方案数
示例1
输入
5 155 5 10 2 3
输出
4
思路一:
用递归加回溯的方法,找出数组的所有子集。
若子集和等于整数sum,则数组A中部分数字和为sum的方案数加一。
可优化的地方在子集当前和大于sum,则跳出该分支,因为数组A为正整数,之后的子集和只会越来越大。
这种方法缺点在于:时间复杂度大,为 O(2 ^ n) ,递归调用次数过多,容易爆栈。
#include<iostream>#include<vector>using namespace std;int n, sum, count = 0;void help(vector<int>& a, int pos, int part) { if (part == sum) count++; if (part > sum) return; for(int i=pos; i<n; i++) { part += a[i]; help(a, i+1, part); part -= a[i]; }}int main(){ cin>>n>>sum; vector<int> a(n); for(int i=0; i<n; i++) cin>>a[i]; help(a, 0, 0); cout<<count<<endl; return 0; }
思路二:
用动态规划,类似01背包问题,f(i , j )表示前i 个数中和为 j 的方案数, 则 若 j >= a[i], f ( i ,j) = f(i -1, j)+ f (i - 1,j - a[i] );
否则, f ( i ,j) = f(i -1, j)。
可优化地方:由于二维数组中,第i行 只与第 i - 1 行有关,所有我们若从 最后一列 开始更新数组,则可用一维数组来保存先前状态。
时间复杂度为:O( n * sum ) 。
#include<iostream>#include<vector>using namespace std;int main() { int n, sum; cin>>n>>sum; vector<long long> a(sum+1); vector<int> b(n); for(int i=0; i<n; i++) cin>>b[i]; a[0] = 1; for (int i=0; i<n; i++) for (int j=sum; j>=b[i]; j--) a[j] += a[j-b[i]]; cout<<a[sum]<<endl; return 0; }
阅读全文
0 0
- 编程题——和为sum的方法数
- [编程题]数字和为sum的方法数
- 数字和为sum的方法数
- 数字和为sum的方法数
- 数字和为sum的方法数
- 数据和为sum的方法数
- 数字和为sum的方法数 滴滴笔试题
- 滴滴出行2017秋招笔试编程题(二)——地下迷宫、数字和为sum的方法数
- 找到和为sum的两个数(剑指offer41、编程之美2.12)
- 2017滴滴校招 数字和为sum的方法数(DP)
- 【算法】拼凑面额+数字和为sum的方法数+走网格 (动态规划)
- 4Sum 4个数字的和为目标数
- 求一组数中的的和为给定值的三个数(3sum)
- 1. Two Sum 给定一个数组和一个数,输出两个和为给定数的数组元素的下标
- 在一个排好序的数组中查找和为sum的两个数
- 在n个整数中选k个,使选出来的数的和为sum
- 在给定数组中查找两个数的和为给定值sum
- 无序数组中找出和为N的两个数 Two Sum
- Maven学习总结(一)——Maven入门
- Codeforces Round #429 (Div. 2):B. Godsend
- web-servlet-tomcat原生部署
- u3d物体包含之后的坐标计算
- 杂记
- 编程题——和为sum的方法数
- 有用的位运算
- TCP/IP入门
- 类反射 模拟Java内省的功能
- zzuli 2179: 紧急营救(有一条边权值可变为0的最短路)
- 用Pyhton获取中国天气网数据
- Spring集成第三方类库(以简单集成elasticsearch 5.x版本客户端为例)
- 【Hibernate】(3)Hibernate的缓存机制
- Codeforces Round #424 (Div. 2, rated, based on VK Cup Finals) F. Bamboo Partition