PTA|口袋取球 子集树

口袋取球

在一个口袋里有x种不同编号的小球(编号从1开始到x),现允许取y次,问取次的结果有哪些可能的情况,为方便区分,要求对取出的小球按编号从大到小进行排序。

输入格式:

在一行中输入两个整数,以空格隔开,分别代表x, 和y。

输出格式:

对每一组可能,在一行中输出这组对应的小球的编号,编号之间以空格分隔,每一行必须以一个回车结束。

输入样例:

在这里给出一组输入。例如:

3 2

输出样例:

在这里给出相应的输出。例如:

3 2 
3 1 
2 1 

这个问题可以使用全排列的类似做法,只是仔细读题会发现,2和1相当于1和2,所以只能取1个就可以了,不用回退到所有 前面已经选择的数。

第一种解法:

组合数,位置标记法

#include<iostream>
using namespace std;
int n,m;//n为有多少个小球,m是取多少次
int res[10000];
void dfs(int x,int n){
    if(x == m+1){
        for(int i = 1;i <= m;i++){
            cout<<res[i]<<" ";
        }
        cout<<endl;
        return;
    }
    for(int i = n;i>=1;i--){
        res[x] = i;
        dfs(x+1,n-1);
    }
}
int main(){
    cin>>n>>m;
    dfs(1,n);//位置,取得次数
    return 0;
}

注意:dfs(x+1,i-1)为dfs( 位置,数字)//这个数字是减少的,不会再从头开始选择

第二种解法:

子集树,参考01背包问题选择与不选择的判断

#include<bits/stdc++.h>
using namespace std;

const int N = 1e6+10; 
int n,m;//小球编号 和 取球次数
vector<int> p;//存放临时解 
void dfs(int x,int count){
	if(count == n){
		if(p.size() ==2){
			for(int i = 0 ; i < 2;i++)
			cout<<p[i]<<" ";
			cout<<endl;
		}
	}
	p.push_back(x);
	dfs(x-1,count+1);
	p.pop_back();
	dfs(x-1,count+1);
}
int main(){
	cin>>n>>m;
	dfs(n,0);//降序选择小球 
}

  • 6
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
子集树是指在背包问题中,根据选择装入背包的物品与不装入背包的物品的不同组合而形成的解空间树。每个节点代表一个可能的子集,节点的左儿子表示将当前物品装入背包,右儿子表示不装入当前物品。 活结点优先队列是指在背包问题中,用于存储待扩展的节点并按照一定的优先级进行排序的队列。在每扩展节点时,从优先队列中选择优先级最高的节点进行扩展。优先级的计算通常是通过界值函数来确定,界值函数可以根据当前节点的状态估计其可能的最大价值。 综上所述,子集树是根据选择装入背包的物品与不装入背包的物品的不同组合而形成的解空间树,而活结点优先队列则是用于存储待扩展的节点并按照一定的优先级进行排序的队列。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [0-1背包问题-分支限界法(优先队列分支限界法)](https://blog.csdn.net/qq_44766883/article/details/106912033)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* *3* [优先队列式分支限界法解01背包](https://blog.csdn.net/qq_41063141/article/details/90318758)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值