【题解】家庭作业

题目描述

  今天玩得很开心,但也很累,呜呜......,不要呀,我的家庭作业还没完成呀!琦琦苦着脸跟妈妈说:可不可以不做呀?(你想太多了。)

  琦琦今天的家庭作业是:给出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;
}
参考程序

猜你喜欢

转载自www.cnblogs.com/kcn999/p/10423481.html