搜索模板(递归实现)

序列操作Ⅰ
描述

给定长度为 N 的正整数序列 A_1, A_2, A_3,…, A_N, 从中选出若干个数,使它们的和是 M,求有多少种选择方案。

输入
第一行是两个数字,表示 N 和 M。(N,M<1000)

输出
一个数字,表示和为 M 的组合的个数。

输入样例 1

4 4
1 1 2 2
输出样例 1

3

//序列操作Ⅰ
//代码:
#include <bits/stdc++.h>

using namespace std;
int n,m,c=0;

void f(int i,int sum,int a[])
{
    if (sum>m) return;
    if (sum==m){
        c++;
        return;
    }
    for (;i<n;i++)
        f(i+1,sum+a[i],a);
}
int main()
{
    scanf("%d %d",&n,&m);
    int a[n+5],t=0;
    for (int i=0;i<n;i++) {
        scanf("%d",&a[i]);
        t+=a[i];
    }
    if (t<m) printf("0\n");
    else if (t==m) printf("1\n");
    else{
        f(0,0,a);
        printf("%d\n",c);
    }
    return 0;
}

装箱问题(也可以用背包来做)
描述

有一个箱子容量为V(正整数,0<=V<=20000),同时有n个物品(0<n<=30),每个物品有一个体积(正整数)。
要求n个物品中,任取若干个装入箱内,使箱子的剩余空间为最小。

输入
每个测试文件只包含一组测试数据,每组输入的第一行为一个整数V(0<=V<=20000),表示箱子的容量。

第二行输入一个整数n(0<n<=30),表示有n个物品。

接下来n行,每行输入一个正整数,表示每个物品的体积。

输出
对于每组输入数据,输出一个整数,表示箱子剩余空间。

输入样例 1

24
6
8
3
12
7
9
7
输出样例 1

0

#include <bits/stdc++.h>

using namespace std;
int a[35],n,v,flag=0,ans;

void f(int i,int sum)
{
    if (sum==v){
        flag=1;
        return;
    }
    for (;i<=n;i++){      //如果当i=2时循环结束了,就++变成3传进去做
        if (!flag && (sum+a[i])<=v){
            ans=min(ans,v-(sum+a[i]));
            f(i+1,sum+a[i]);
        }
    }
}
int main()
{
    scanf("%d %d",&v,&n);
    ans=v;
    for (int i=1;i<=n;i++)
        scanf("%d",&a[i]);
    f(1,0);
    printf("%d\n",ans);
    return 0;
}

©️2020 CSDN 皮肤主题: 数字20 设计师:CSDN官方博客 返回首页