回溯法 已知两个非负整数n和k(n>=k),列出集合S={1,2,~,n}的所有k组合

本文介绍了一个组合算法的Java实现,该算法能够找出指定集合S中所有可能的k个元素的组合。通过递归的方式,程序遍历集合S并记录下所有有效的组合方案。
/**
 * 已知两个非负整数n和k(n>=k),列出集合S={1,2,~,n}的所有k组合
 * @author JH
 *
 */
public class three {
    private static int n;
    private static int k;
    private static int[] list;

    private static int count=0;
    private static int num=0;

    public static void zuhe(int i) {
        if(i >= n){
            if(count==k) {
                output();
                num++;
            }
            return;
        }
        list[i] = 1;
        count++;
        zuhe(i+1);
        list[i] = 0;
        count--;
        zuhe(i+1);
    }

    public static void output() {
        for(int i = 0; i<n; i++) {
            if(list[i] != 0)
                System.out.print((i+1)+" ");
        }
        System.out.println();
    }

    @SuppressWarnings("resource")
    public static void main(String[] args) {
        Scanner s = new Scanner(System.in);
        System.out.print("输入非负整数N");
        n=s.nextInt();
        list = new int[n];
        System.out.print("输入子集整数个数");
        k=s.nextInt();
        zuhe(0);
        System.out.println(num+"种");
    }
}
鲁宾逊先生有一只宠物猴,名叫多多。这天,他们两个正沿着乡间小路散步,突然发现路边的告示牌上贴着一张小小的纸条:“欢迎免费品尝我种的花生!——熊字”。 鲁宾逊先生多多都很开心,因为花生正是他们的最爱。在告示牌背后,路边真的有一块花生田,花生植株整齐地排列成矩形网格(如图1)。有经验的多多一眼就能看出,每棵花生植株下的花生有多少。为了训练多多的算术,鲁宾逊先生说:“你先找出花生最多的植株,去采摘它的花生;然后再找出剩下的植株里花生最多的,去采摘它的花生;依此类推,不过你一定要在我限定的时间内回到路边。” 我们假定多多在每个单位时间内,可以做下列四件事情中的一件: 1) 从路边跳到最靠近路边(即第一行)的某棵花生植株; 2) 从一棵植株跳到前后左右与之相邻的另一棵植株; 3) 采摘一棵植株下的花生; 4) 从最靠近路边(即第一行)的某棵花生植株跳回路边。 现在给定一块花生田的大小花生的分布,请问在限定时间内,多多最多可以采到多少个花生?注意可能只有部分植株下面长有花生,假设这些植株下的花生个数各不相同。 例如在图2所示的花生田里,只有位于(2, 5), (3, 7), (4, 2), (5, 4)的植株下长有花生,个数分别为13, 7, 15, 9。沿着图示的路线,多多在21个单位时间内,最多可以采到37个花生。 输入 第一行包括三个整数,M, NK,用空格隔开;表示花生田的大小为M * N(1 <= M, N <= 20),多多采花生的限定时间为K(0 <= K <= 1000)个单位时间。接下来的M行,每行包括N个非负整数,也用空格隔开;第i + 1行的第j个整数Pij(0 <= Pij <= 500)表示花生田里植株(i, j)下花生的数目,0表示该植株下没有花生。 输出 包括一行,这一行只包含一个整数,即在限定时间内,多多最多可以采到花生的个数。 样例输入 样例 #1: 6 7 21 0 0 0 0 0 0 0 0 0 0 0 13 0 0 0 0 0 0 0 0 7 0 15 0 0 0 0 0 0 0 0 9 0 0 0 0 0 0 0 0 0 0 样例 #2: 6 7 20 0 0 0 0 0 0 0 0 0 0 0 13 0 0 0 0 0 0 0 0 7 0 15 0 0 0 0 0 0 0 0 9 0 0 0 0 0 0 0 0 0 0 样例输出 样例 #1: 37 样例 #228
最新发布
03-14
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值