程序填空题:求解数字和为sum的方法数问题(动态规划)
求解数字和为sum的方法数问题。给定一个有n个正整数的数组a和一个整数sum,求选择数组a中部分数字和为sum的方案数。若两种选取方案有一个数字的下标不一样,则认为是不同的方案。
```c++
#include
#include
#include
#include
#define MAXN 1001
#define MAXS 1001
using namespace std;
int a[MAXN];
long long dp[MAXN][MAXS];
int n,sum;
long long solve();
int main()
{
cin>>n>>sum;
for(int i=1;i<=n;i++)
cin>>a[i];
cout< return 0;
}
long long solve()
{ int i,j;
for(i=0;i =1;
for(j=1;j =0;
for (i=1;i<=n;i++)
for(j=0;j<=sum;j++)
{
if (a[i]<=j)
dp[i][j]=;
else
dp[i][j]=;
}
return ;
}
```
### 输入格式:
第1行为两个正整数n(1≤n≤1000),sum(1≤sum≤1000),第2行为n个正整数a[i](32位整数),以空格隔开。
```in
5 15
5 5 10 2 3
```
### 输出格式:
输出方案数。
```out
4
```
答案:
第1空:dp[i][0]
第2空:dp[0][j]
第3空:dp[i-1][j-a[i]]+dp[i-1][j]
第4空:dp[i-1][j]
第5空:dp[n][sum]
```c++
#include
#include
#include
#include
#define MAXN 1001
#define MAXS 1001
using namespace std;
int a[MAXN];
long long dp[MAXN][MAXS];
int n,sum;
long long solve();
int main()
{
cin>>n>>sum;
for(int i=1;i<=n;i++)
cin>>a[i];
cout<
}
long long solve()
{ int i,j;
for(i=0;i
for(j=1;j
for (i=1;i<=n;i++)
for(j=0;j<=sum;j++)
{
if (a[i]<=j)
dp[i][j]=;
else
dp[i][j]=;
}
return ;
}
```
### 输入格式:
第1行为两个正整数n(1≤n≤1000),sum(1≤sum≤1000),第2行为n个正整数a[i](32位整数),以空格隔开。
```in
5 15
5 5 10 2 3
```
### 输出格式:
输出方案数。
```out
4
```
答案:
第1空:dp[i][0]
第2空:dp[0][j]
第3空:dp[i-1][j-a[i]]+dp[i-1][j]
第4空:dp[i-1][j]
第5空:dp[n][sum]