问题描述:
给定一个有n个正整数的数组A和一个整数sum,求选择数组A中部分数字和为sum的方案数。
当两种选取方案有一个数字的下标不一样,我们就认为是不同的组成方案。
输入描述:
输入为两行: 第一行为两个正整数n(1 ≤ n ≤ 1000),sum(1 ≤ sum ≤ 1000)第二行为n个正整数A[i](32位整数),以空格隔开。
输出描述:
输出所求的方案数
示例1
输入
5 15
5 5 10 2 3
输出
4
这道题是一道动态规划的背包,我们以上面的输入输出为例
首先,将输入的数据放到一个一维数组里,我这里使用的是vector,都一样
注意: 下标为0的位置跳过,这个位置默认值为0,我们的数据从下标为1的位置开始
下标 |
0 |
1 |
2 |
3 |
4 |
5 |
v[i] |
0 |
5 |
5 |
10 |
2 |
3 |
接下来我们构建一个二维数组,由于这个题目给出的n,sum的范围都是 1000,于是我们构建一个 1001*1001的二维数组dp
注意: 这个数组不要构建在栈上,这个空间可能很大,这里要求的是1000,有的题目会要求5000,难道要在栈上构建一个 5001*5001*sizeof(int) 大小的空间吗
所以这里建议将这个数组定义在全局区或者在对上动态开辟,不过我觉得在全局区上使用起来比较简单
p[i] |
|
0 |
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
0 |
0 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
5 |
1 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
5 |
2 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
10 |
3 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2 |
4 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
3 |
5 |
|
|
|
|
|
|
|