用c语言详细的补充这个函数接口,把这个函数定义出来,要求运行结果和输出样例相同 求解数字和为sum的方法数问题(动态规划法) 求解数字和为sum的方法数问题。给定一个有n个正整数的数组a和一个整数sum,求选择数组a中部分数字和为sum的方案数。若两种选取方案有一个数字的下标不一样,则认为是不同的方案。 函数接口定义: long solve(); 裁判测试程序样例: #define MAXN 1001 #define MAXS 1001 using namespace std; int a[MAXN]; long dp[MAXN][MAXS]; int n,sum; long solve(); int main() { cin>>n>>sum; for(int i=1;i<=n;i++) cin>>a[i]; cout<<solve(); return 0; } /* 请在这里填写答案 */ 输入格式: 第1行为两个正整数n(1≤n≤1000),sum(1≤sum≤1000),第2行为n个正整数ai,以空格隔开。 5 15 5 5 10 2 3 输出格式: 输出方案数。 4
时间: 2024-01-11 15:02:18 浏览: 102
```c
#include <stdio.h>
#include <string.h>
#define MAXN 1001
#define MAXS 1001
int a[MAXN];
long dp[MAXN][MAXS];
int n, sum;
long solve() {
// 初始化 dp 数组
memset(dp, 0, sizeof(dp));
for (int i = 0; i <= n; i++) {
dp[i][0] = 1;
}
// 动态规划转移
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= sum; j++) {
if (j >= a[i]) {
dp[i][j] = dp[i - 1][j] + dp[i - 1][j - a[i]];
} else {
dp[i][j] = dp[i - 1][j];
}
}
}
return dp[n][sum];
}
int main() {
scanf("%d%d", &n, &sum);
for (int i = 1; i <= n; i++) {
scanf("%d", &a[i]);
}
printf("%ld\n", solve());
return 0;
}
```
阅读全文