栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

体积(C++)[递归][记忆化]

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

体积(C++)[递归][记忆化]

前言:

最近,由于学习原因,没有更新了(其实就是忘了),所以近期打算讲讲记忆化的题。

题目:

Description

给出 n 件物品,每件物品有一个体积 V i ,求从中取出若干件物品能够组成的不同的体积和有多少种可能。

Format

Input

第 1 行 1 个正整数,表示 n。

第 2 行 n 个正整数,表示 V i ,每两个数之间用一个空格隔开。

n小于等于20,总体积小于等于1000

Output

一行一个数,表示不同的体积和有多少种可能。

Samples

【输入样例】

输入数据 1
3 
1 3 4

Copy

输出数据 1
6

Copy

【输出样例】

Limitation

1s, 1024KiB for each test case.

 分析:

首先,我们可以用递归来做这道题,思路如下:

每个数我们可以选择加或者不加,

但是和有可能会重复,

so,加个记忆化就行了。

奉上代码:
#include 
using namespace std;
int a[21], n;
bool b[1000000];//记忆化,如果b[i]为0(假),则代表i没出现过,为1(真)代表出现过。 
int ans = 0;
void dfs(int dep, int sum) {//dep,深度;sum,和。 
    if (dep == n + 1) {//记忆化 
        if(!b[sum]&&sum)
        {
        	b[sum] = true;
        	ans++;
		}
        return ;
    }
    dfs(dep + 1, sum + a[dep]); //递归下一深度,和加a[dep]。 
    dfs(dep + 1, sum);//递归下一深度,和不变 
}
int main() {
    cin >> n;

    for (int i = 1; i <= n; i++)
        cin >> a[i];

    dfs(1, 0);
   


    cout << ans << endl;

    return 0;
}

 

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/330865.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号