子集和数问题——回溯法
已知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)。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 | 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); } } |
时间最会骗人,但也能让你明白,这个世界上没有什么是不能失去的,留下的尽力珍惜,得不到的都不重要
【推荐】还在用 ECharts 开发大屏?试试这款永久免费的开源 BI 工具!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步