原题链接:信息学奥赛一本通T1291-数字组合
解题思路:
注意事项:
参考代码:
DFS
#include"bits/stdc++.h" using namespace std; // 全局变量声明 int n, t, a[25]; // n: 数组大小,t: 目标和,a: 存储输入的数组 int kkk = 0; // 计数器,记录满足条件的组合数 void dfs(int x, int sum) { // 如果当前组合的和大于目标值,则返回 if (sum > t) return; // 如果当前组合的和等于目标值,则计数器加1 if (sum == t) { kkk++; return; } // 遍历从当前索引到数组末尾的所有元素 for (int i = x; i <= n; i++) { // 递归调用dfs函数,处理下一个元素 dfs(i + 1, sum + a[i]); } } int main() { // 读取输入的n和t cin >> n >> t; // 读取数组a的元素 for (int i = 1; i <= n; i++) { cin >> a[i]; } // 调用dfs函数,从第一个元素开始,初始和为0 dfs(1, 0); // 输出满足条件的组合数 cout << kkk << endl; return 0; }
DP
#include"bits/stdc++.h" using namespace std; // 定义全局变量n, t和数组a, dp int n,t,a[25],dp[1100]; int main(){ // 读取输入的n和t的值 cin>>n>>t; // 读取n个整数并存储到数组a中 for(int i=1;i<=n;i++){ cin>>a[i]; } // 初始化dp数组,dp[0]设为1表示目标和为0时有一种方案 dp[0]=1; // 动态规划计算组合数 for(int i=1;i<=n;i++){ for(int j=t;j>=a[i];j--){ // 更新dp数组,当前状态由前一个状态转移而来 dp[j]=dp[j]+dp[j-a[i]]; } } // 输出结果,即达到目标和t的组合数 cout<<dp[t]<<endl; return 0; }
0.0分
0 人评分
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复