搜索顺序:搜n个砝码,每个砝码有三种可能,完成一个方案回溯
过掉50%代码1:(Set自带去重,香的嘞)
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.math.BigInteger;
import java.util.*;
public class Main
{
static PrintWriter pw = new PrintWriter(new BufferedWriter(new OutputStreamWriter(System.out)));
static int N = (int)1e5 + 10;
static int n;
static int w[] = new int[N];
static Set<Integer> set = new HashSet<>();
// 搜索顺序:搜n个砝码,每个砝码有三种可能,完成一个方案回溯
static void dfs(int cur_num, int weight) // 当前的状态,选了多少个砝码,重量是多少
{
if(cur_num == n + 1) // cur_num偏移到n + 1,判断方案
{
// 重量是整的,丢到set去重
if(weight > 0) set.add(weight);
return;
}
// cur_num + 1既代表当前的砝码数量,也代表w的下标
dfs(cur_num + 1,weight + w[cur_num + 1]); // 砝码放左边
dfs(cur_num + 1, weight); // 砝码放中间
dfs(cur_num + 1,weight - w[cur_num + 1]); // 砝码放右边
}
public static void main(String[] args ) throws IOException
{
n = rd.nextInt();
for(int i = 1 ; i <= n ; i ++) w[i] = rd.nextInt();
dfs(0,0); // 选了多少个砝码,重量是多少
pw.println(set.size());
pw.flush();
}
}
class rd
{
static BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
static StringTokenizer tokenizer = new StringTokenizer("");
static String nextLine() throws IOException { return reader.readLine(); }
static String next() throws IOException
{
while (!tokenizer.hasMoreTokens()) tokenizer = new StringTokenizer(reader.readLine());
return tokenizer.nextToken();
}
static int nextInt() throws IOException { return Integer.parseInt(next()); }
static double nextDouble() throws IOException { return Double.parseDouble(next()); }
static long nextLong() throws IOException { return Long.parseLong(next());}
static BigInteger nextBigInteger() throws IOException
{
BigInteger d = new BigInteger(rd.nextLine());
return d;
}
}
class PII
{
int x,y;
public PII(int x ,int y)
{
this.x = x;
this.y = y;
}
}
过掉50%代码2:(st数组去重)
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.math.BigInteger;
import java.util.*;
public class Main
{
static PrintWriter pw = new PrintWriter(new BufferedWriter(new OutputStreamWriter(System.out)));
static int N = (int)1e6 + 10;
static int w[] = new int[N];
static boolean st[] = new boolean[N];
static int n;
static int res;
static void dfs(int k,int sum) // 表示k个砝码,重量是sum
{
if(k > n) // 选完n个砝码
{
if(sum > 0 && !st[sum]) // 判断选出来的n个砝码是否没被标记过,如没标记则答案加1
{
res ++;
st[sum] = true;
}
return;
}
dfs(k + 1,sum - w[k]);
dfs(k + 1,sum);
dfs(k + 1, sum + w[k]);
}
public static void main(String[] args ) throws IOException
{
n = rd.nextInt();
for(int i = 1 ; i <= n ; i ++) w[i] = rd.nextInt();
dfs(0,0);
pw.println(res);
pw.flush();
}
}
class rd
{
static BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
static StringTokenizer tokenizer = new StringTokenizer("");
static String nextLine() throws IOException { return reader.readLine(); }
static String next() throws IOException
{
while (!tokenizer.hasMoreTokens()) tokenizer = new StringTokenizer(reader.readLine());
return tokenizer.nextToken();
}
static int nextInt() throws IOException { return Integer.parseInt(next()); }
static double nextDouble() throws IOException { return Double.parseDouble(next()); }
static long nextLong() throws IOException { return Long.parseLong(next());}
static BigInteger nextBigInteger() throws IOException
{
BigInteger d = new BigInteger(rd.nextLine());
return d;
}
}
class PII
{
int x,y;
public PII(int x ,int y)
{
this.x = x;
this.y = y;
}
}