题解 P2725 【邮票 Stamps】

· · 题解

罕见的一篇深搜做法,望通过!

#include <cstdio>
#include <iostream>
using namespace std;

int Answer(int K, int N, int a[]);
void Input(int a[], int N);
bool Solve(int K, int N, int Sum, int a[]);

int main()
{
    int K, N;                   // K 表示邮票数量上限, N 表示邮票面值种数。 
    cin >> K >> N;
    int a[N];
    Input(a, N);                // 输入每张邮票的面值。 
    cout << Answer(K, N, a);    // 输出结果,即最大的邮票可表示的面值。 
    return 0;
}

void Input(int a[], int N)
{
    for(int i=0; i<N; ++i)
        cin >> a[i];
}

int Answer(int K, int N, int a[])       // 逐个测试,直到凑不成停下并返回结果。 
{
    int ret=1;
    while ( Solve(K, N, ret, a) )       // 如果可以,则继续。 
        ++ret; 
    return ret;
}

bool Solve(int K, int N, int Sum, int a[])  // Sum 表示所求得的值。 
{
    // 枚举法 深度优先搜索 (递归)
    if ( Sum < 0 )  return false;           // 如果小于 0 则失败。 
    if ( Sum = 0 )  return true;            // 正好为零,凑成所求值。 
    // 如果大于 0 ,则…… 
    for(int i=0; i<N; ++i)                  // 遍历每一种邮票 
        for(int j=0; j<K; ++j)              // 遍历最高 K 遍 
            if( Solve(K-1, N, Sum-a[i], a) )
                return true;
}