【动态规划】数组中数字和为sum的方案个数
给定一个有 nnn个正整数的数组 a
和一个正整数 sumsumsum,求选择数组 a
中
部分数字和为sumsumsum的方案数。若两种选取方案有一个数字的下标不一样,则认为是不同的方案。
输入描述:输入为两行,第一行为两个正整数 aaa和 sumsumsum,第二行为 nnn 个正整数a[i]
,以空格隔开。
输出描述:输出所求的方案数。
设计算法实现上述需求,并分析算法的时间复杂度。
代码实现
#include<bits/stdc++.h>
using namespace std;
#define MAX 100
int a[MAX] = {
5,5,10,2,3};
int n = 5,sum=15;
void printNum(int num[MAX][MAX],int n,int sum);
int getPro(int a[],int sum,int n)
{
int res=0;
int dp[MAX][MAX]={
0};
if(sum==0)return 0;
for(int i=0;i<=n;i++)
{
dp[i][0]=1;
}
printNum(dp,n,sum);
for(int i=1;i<=sum;i++)
{
dp[0][i]=0;
}
for(int i=1;i<=n;i++)
{
for(int j=1;j<=sum;j++)
{
if(a[i-1]>j)
{
dp[i][j] = dp[i-1][j];//这时候背包已经装不下新的物品了,所以可装的物品应该不变,即继承了上一行的值即可 -> dp[i][j] = dp[i-1][j]
}
else
{
dp[i][j] = dp[i-1][j]+dp[i-1][j-a[i-1]];
}
}
printNum(dp,n,sum);
}
printNum(dp,n,sum);
return dp[n][sum];
}
void printNum(int num[MAX][MAX],int n,int sum){
cout << "\t ";
for(int i=0;i<=sum;i++)
{
printf("%2d ",i);
}
cout << endl;
printf("\t ");
for(int j=0;j<=sum;j