从n个数中选择m个数,使其和为s
2013-08-27 16:24
246 查看
题目:从n个数中任选m(小于n)个数,使其和为s
//判断数组b对应的数组a中的元素之和是否为s
bool isSum(int a[], int b[], int n, int s) {
int ret = 0;
for (int i = 0; i < n; i++) {
ret += a[b[i]];
}
return s == ret;
}
//a:初始数组
//n:a包含的元素个数
//m:选出元素的个数
//b:存放结果的数组
//bn:数组b的元素个数,等于m
void combine(int a[], int n, int m, int b[], int bn, int s) {
for (int i = n; i >= m; i--) {
b[m - 1] = i - 1;
if (m > 1) { //一共要选m个数,故m = 1时才结束递归
combine(a, i - 1, m - 1, b, bn, s);
} else if (isSum(a, b, bn, s)) {
for (int j = bn - 1; j >= 0; j--) {
cout << a[b[j]] << ' ';
}
cout << endl;
}
}
}
// 从包含n个元素的数组a中任选m个数,使其各为s,输出所有的组合
void combine(int a[], int n, int m, int s) {
int b[m];
combine(a, n, m, b, m, s);
}
//判断数组b对应的数组a中的元素之和是否为s
bool isSum(int a[], int b[], int n, int s) {
int ret = 0;
for (int i = 0; i < n; i++) {
ret += a[b[i]];
}
return s == ret;
}
//a:初始数组
//n:a包含的元素个数
//m:选出元素的个数
//b:存放结果的数组
//bn:数组b的元素个数,等于m
void combine(int a[], int n, int m, int b[], int bn, int s) {
for (int i = n; i >= m; i--) {
b[m - 1] = i - 1;
if (m > 1) { //一共要选m个数,故m = 1时才结束递归
combine(a, i - 1, m - 1, b, bn, s);
} else if (isSum(a, b, bn, s)) {
for (int j = bn - 1; j >= 0; j--) {
cout << a[b[j]] << ' ';
}
cout << endl;
}
}
}
// 从包含n个元素的数组a中任选m个数,使其各为s,输出所有的组合
void combine(int a[], int n, int m, int s) {
int b[m];
combine(a, n, m, b, m, s);
}
相关文章推荐
- J2EE开发者选择何种AJAX框架
- 算法导论-选择排序
- 左右选择
- 图片上传时本机图片选择
- 编译前进行配置选择
- 一次探索,关于网络电话软件选择
- 数据仓库项目应该如何选择ETL工具:ETL or E-LT
- 如何为网站选择支付接口
- 嵌入式选择C语言
- 第4章:复杂选择结构
- 如何为不同的硬件配置选择合适的图表开发工具?
- React-Native开发:react-native-file-selector选择文件组件的使用(安卓)
- 企业网接入新选择 免疫墙路由器
- 浅谈多进程多线程的选择
- 软件大赛题目----(第四个)选择-每数到3就出列1个最后剩下1个是谁
- 条件表达式的使用----字符和数字的选择问题
- 《Android开发卷——自定义日期选择器(三)》
- scrum学习理解-看板工具选择
- android Activity实现从底部弹出或滑出选择菜单或窗口