题目描述
今天玩得很开心,但也很累,呜呜......,不要呀,我的家庭作业还没完成呀!琦琦苦着脸跟妈妈说:可不可以不做呀?(你想太多了。)
琦琦今天的家庭作业是:给出m个数,从这m个数中任选n个数相加,可得到一系列的和。例如当m=4,n=3,4个整数分别是3,7,10,11时,可得全部的组合与它们的和为:
3+7+10=20
3+7+11=21
7+10+11=28
3+10+11=24
要求计算出共得到多少个不同的和。
你能帮琦琦完成她的家庭作业吗?
输入输出格式
输入格式
第一行为两个整数m,n(0<n≤m≤20);
第二行为m个0-500之间的的整数。
输出格式
一行,为得到的不同和的个数。
输入输出样例
输入样例一
4 3
3 7 10 11
输出样例一
4
输入样例二
3 1
0 1 1
输出样例二
2
输入样例三
3 2
1 2 3
输出样例三
3
题解
这题看起来用背包很麻烦,其实我们可以枚举这n个数的位置,再判断答案。
#include <iostream> using namespace std; int m, n; int a[25]; int b[25]; int c[10005]; int sum; int ans; int main() { cin >> m >> n; for(register int i = 1; i <= m; ++i) { cin >> a[i]; } for(register int i = 1; i <= n; ++i) { b[i] = i; sum += a[i]; } b[n + 1] = m + 1; while(b[n] <= m) { if(!c[sum]) c[sum] = 1, ++ans; sum -= a[b[1]++]; int i = 1; while(i <= n && b[i] == b[i + 1]) { b[i] = i; sum += a[i]; sum -= a[b[++i]++]; } sum += a[b[i]]; } cout << ans; return 0; }