zoukankan      html  css  js  c++  java
  • 子集和数问题——回溯法

     已知n个正数:wi, 1<=i<=n, 和M。要求找出{wi }的所有子集使得子集内元素之和等于M。例如:

           n=4,     (w1,w2,w3,w4)=(11,13,24,7),M=31   则满足要求的子集是(11,13,7)和(24,7)。

    package com.lanxi.demo1;
    
    public class Subset {
    	static int M,n;
    	static int[] w=new int[100];
    	static int[] x=new int[100];
    	public static void SumOfSub(int s, int k, int r)//s:当前和数 k:当前个数 r:总数和
    	{
    	    int i;
    	    x[k]=1;
    	    if(s+w[k]==M) //子集找到
    	    {
    	    	System.out.print("answer:");
    	        for(i=1; i<=k; i++)
    	        	if(x[i]==1) System.out.print(w[i]+" ");
    	        System.out.println("");
    	    }else if(s+w[k]+w[k+1]<=M)
    	        SumOfSub(s+w[k], k+1, r-w[k]);
    	    
    	    if(s+r-w[k]>=M && s+w[k+1]<=M)
    	    {
    	        x[k]=0;
    	        SumOfSub(s, k+1, r-w[k]);
    	    }
    	} 
    public static void main(String arg[])
    	{
    	    int s,k,r;
    	    n=4;
    	    w[1]=7;
    	    w[2]=11;
    	    w[3]=13;
    	    w[4]=24;
    	    M=31;
    	    
    	    s=0;
    	    k=1;
    	    r=55;
    	    
    	    SumOfSub(s, k, r);
    	}
    
    }
    

      

  • 相关阅读:
    codevs 1031 质数环
    codevs 1005 生日礼物
    codevs 1004 四子连棋
    codevs 2292 图灵机游戏
    1439 统计素数个数
    1675 大质数 2
    codevs 1462 素数和
    [NOIp2012提高组]借教室
    [NOIp2007提高组]矩阵取数游戏
    [TJOI2017]城市
  • 原文地址:https://www.cnblogs.com/www-x/p/8243442.html
Copyright © 2011-2022 走看看