1050.鸣人的影分身(dp同n苹果放m个盘子,dfs控制搜索结果不重复⭐)

这篇具有很好参考价值的文章主要介绍了1050.鸣人的影分身(dp同n苹果放m个盘子,dfs控制搜索结果不重复⭐)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1050.鸣人的影分身(dp同n苹果放m个盘子,dfs控制搜索结果不重复)

1050.鸣人的影分身(dp同n苹果放m个盘子,dfs控制搜索结果不重复⭐)
输入样例:

1
7 3

输出样例:

8

m个苹果,n个盘子

#include <bits/stdc++.h>
using namespace std;
int T,m,n;
const int N=15;
int dp[N][N];//前i个分身,耗费j查克拉的方法
int dfs(int m,int n){//m个苹果,n个盘子
    if(m==0)return 1;//每个盘子都空着,这一种
    if(n==0)return 0;
    if(m<n)return dfs(m,m);//n-m个盘子必定是空的,不必考虑
    else{
        return dfs(m-n,n)+dfs(m,n-1);//每个盘子先放一个+丢掉一个盘子
    }
}
signed main(){
    
    cin>>T;
    while(T--){
        cin>>m>>n;
        
        cout<<dfs(m,n)<<endl;
       
    }
    return 0;
}

dp

要想省去多组输入的初始化dp数组,应该让对dp元素赋值的语句在前

  dp[i][j]=dp[i][j-1];//第j个盘子放0个
  if(i>=j)dp[i][j]+=dp[i-j][j];//每个盘子 先给一个苹果           
#include <bits/stdc++.h>
using namespace std;
int T,m,n;
const int N=15;
int dp[N][N];//i个查克拉分给j个分身的方法

signed main(){
    
    cin>>T;
    while(T--){
        cin>>m>>n;
        memset(dp,0,sizeof(dp));
        dp[0][0]=1;
        for(int i=0;i<=m;i++){
            for(int j=1;j<=n;j++){//至少有一个盘子先
            
                if(i>=j)dp[i][j]+=dp[i-j][j];//每个盘子 先给一个苹果
                dp[i][j]+=dp[i][j-1];//第j个盘子放0个
                
            }
        }
       cout<<dp[m][n]<<endl;
    }
    return 0;
}

dfs爆搜

dfs搜索不同路径,只能避免这条路的组成序列整体不同,但是对于(2,2,3)和(2,3,2),会算作两条不同的路径,
为了避免两个相同的组合,试想过记录每个搜索的路径,判断两条路径的组成元素是否相同,(一个二进制数只适合记录 选取不同元素的情况),但即使存储在map容器中,map<vector< int > ,int> 也需要先对vector数组排序,太过麻烦,但也同时意识到,将序列元素排序后,重复的路径在排序后是一致的
于是限制dfs,爆搜路径时,只搜索 元素非递减排列的序列,重复的序列在排序后都归于这一种情况,于是可以避免重复。
为了控制每条路径上元素按非递减序列排序,在枚举 第i个元素时(这条路上前i-1个元素已经枚举完,令start=第i-1个元素),需要从 start 开始枚举文章来源地址https://www.toymoban.com/news/detail-401763.html

#include <bits/stdc++.h>
using namespace std;
int T,m,n;
const int N=15;
int dp[N][N];//前i个分身,耗费j查克拉的方法
int res=0;
map<int,int> mp;
void dfs(int u,int sum,int start){//,int rd
    if(sum>m)return ;
    if(u==n+1){
        if(sum==m){//&&mp.count(rd)==0
            res++;
            // mp[rd]++;
        }
        return ;
    }
    for(int i=start;i+sum<=m;i++){
        // int tmp=rd+(1<<i);
        dfs(u+1,sum+i,i);
    }
}
signed main(){
    
    cin>>T;
    while(T--){
        cin>>m>>n;
        // dp[0][0]=1;
        // for(int i=1;i<=n;i++){
        //     for(int j=0;j<=m;j++){
        //         dp[i][j]=dp[i-1][j];//第i个分身分配0
                
        //     }
        // }
        dfs(1,0,0);
        cout<<res<<endl;
        res=0;
    }
    return 0;
}
#include <bits/stdc++.h>
using namespace std;
int T,m,n;
const int N=15;
int dp[N][N];//前i个分身,耗费j查克拉的方法
int res=0;
map<int,int> mp;
void dfs(int u,int sum){//,int rd
    if(sum>m)return ;
    if(u==n+1){
        if(sum==m){//&&mp.count(rd)==0
            res++;
            // mp[rd]++;
        }
        return ;
    }
    for(int i=0;i+sum<=m;i++){
        // int tmp=rd+(1<<i);
        dfs(u+1,sum+i);
    }
}
signed main(){    
    cin>>T;
    while(T--){
        cin>>m>>n;
        dfs(1,0);
        cout<<res<<endl;
        res=0;
    }
    return 0;
}

到了这里,关于1050.鸣人的影分身(dp同n苹果放m个盘子,dfs控制搜索结果不重复⭐)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 法大大携手盘子女人坊,以数字化唤醒国风摄影新体验

    第三方数据显示,目前,我国共有163万家摄影相关企业,有约1900个从事摄影相关业务的品牌,且预计到2025年艺术摄影市场规模将达到7063.18亿元。艺术摄影行业作为在时代进步、科技发展以及人民生活水平提高的推动下逐渐发展起来的行业,时至今日,行业竞争已经进入白热

    2024年02月15日
    浏览(25)
  • 华为鸿蒙3.0的锁data文件及QQ分身文件导出方法(其他分身同理)

    以下适用于鸿蒙3.0更新后到3.0.0.2,不保证后续再更新仍可行。 问题描述:鸿蒙3.0更新后把/Android/data文件夹锁住了,通过常规手段打开什么都没有,通过系统软件文件管理的/内部存储/Android/data/可以打开,进而找到QQ文件存储路径/com.tencent.mobileqq/Tencent/QQfile_recv/,但是/内部存

    2024年02月11日
    浏览(26)
  • 能在电脑同时控制苹果和安卓的软件,找到了!

    开门见山,既能远程控制安卓手机又能控制iPhone或iPad的软件是AirDroid Cast。 AirDroid Cast是一款专业、强大且易于使用的投屏控制工具。不仅可以将安卓手机(安卓7.0及以上版本)、iPhone、iPad的屏幕画面投射到电脑上, 还支持在电脑上使用鼠标直接控制它们。 下载AirDroid Cast

    2024年02月04日
    浏览(31)
  • IOS手机越狱并分身

    1、设备连接【爱思助手】软件一键越狱 2、越狱后找到Loader软件安装Cydia 3、完成后打开Cydia,若提示更新软件-更新所有软件 4、软件源→添加Cydia的path: http://cydia.iphonecake.com,添加后,单独软件源列表有显示AppCake 5、软件源→添加crackerxi的path: https://cydia.iphonecake.com 6、切到搜

    2024年02月06日
    浏览(40)
  • 1050 String Subtraction(13行代码)

    分数 20 全屏浏览题目 切换布局 作者 CHEN, Yue 单位 浙江大学 Given two strings S1​ and S2​, S=S1​−S2​ is defined to be the remaining string after taking all the characters in S2​ from S1​. Your task is simply to calculate S1​−S2​ for any given strings. However, it might not be that simple to do it  fast . I

    2024年02月07日
    浏览(41)
  • mac电脑微信开分身小妙招

    1. 首先登录你自己的第一个微信。 2.在应用程序中找到你的微信,右键点击显示包内容  3.双击进入Contens文件夹 4.双击MacOS文件夹 ,选中WeChat,右键选择制作替身,并把这个替身拉到桌面,想要启动第二个微信,直接双击这个替身就可以了,打开的WeChat终端窗口最小化就可以了

    2024年02月11日
    浏览(22)
  • 人人可拥有刘强东同款数字人分身!

    每个人都可以拥有东哥同款数字人分身直播间进行直播带货, 怎样克隆自己的数字人形象? 青否数字人克隆源码的克隆效果媲美真人: 仅需将真人录制的2-6分钟视频上传至克隆端后台,系统便会自动启动自动克隆。3-5小时后,即可生成一个与本人在形象、表情及动作上1:

    2024年04月22日
    浏览(18)
  • HAUE河工计院OJ1001 - 1050题解

    目录 1001: a+b 1002: 分铅笔  1003: 求圆的面积  1004: 正整数的位数  1005: 英文字母的字母表位序  1006: 两个整数的四则运算  1007: 三位数的数位分离  1008: 压岁钱存款  1009: 等差数列求和  1010: 输出字符ASCII码值的2倍  1011: 虫子吃苹果 1012: 三个整数的和 1013: 身份证求出生日期

    2024年02月08日
    浏览(24)
  • C++每日一练:详解-买铅笔&影分身&三而竭

    这回又换成C++了,Python要用C++也要用,没有哪个正经程序员只会一门语言的,咱可是CSDN认证带V的全栈攻城狮。今天的题目除了买铅笔都还是有点难度的,虽然影分身主要是考验阅读理解能力。 提示:以下是本篇文章正文内容,下面案例可供参考 题目描述 P老师需要去商店买

    2024年02月05日
    浏览(22)
  • 如何使用 GTX750 或 1050 显卡安装 CUDA11+

            由于兼容性问题,使得我们若想用较新版本的 PyTorch,通过 GPU 方式训练模型,也得更换较新版本得 CUDA 工具包。然而 CUDA 的版本又与电脑显卡的驱动程序版本关联,如果是低版本的显卡驱动程序安装 CUDA11 及以上肯定会失败。         比如 GTX750Ti 或 GTX1050Ti,出厂

    2024年02月05日
    浏览(32)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包