本题基本思路,就是类似与01背包问题
就是加入这个砝码以后会如何,简单来说就是用一个数组统计之前可以组成的砝码重量,而后再与新加入砝码,进行加减
最后遍历统计即可,具体可参照代码
代码如下
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.io.StreamTokenizer;
public class Main砝码称重 {
public static void main(String[] args) throws IOException {
StreamTokenizer x = new StreamTokenizer(new BufferedReader(new InputStreamReader(System.in)));
PrintWriter out = new PrintWriter(new OutputStreamWriter(System.out));
x.nextToken();
int n=(int)x.nval;
int aa[]=new int[n];
int sum=0;
for(int i=0;i<n;i++) {
x.nextToken();
aa[i]=(int)x.nval;
sum+=aa[i];
}
//类似与01背包问题
boolean dp[][]=new boolean[2][sum+1];//dp[0]用来记录加入aa[i],之前的情况,dp[1]用来更新
for(int i=0;i<n;i++) {
dp[1][aa[i]]=true;//这个没有任何其他砝码的情况
for(int j=1;j<=sum;j++) {
if(dp[0][j]) {//如果这个砝码重量可以出现
if(Math.abs(j-aa[i])<=sum)
dp[1][Math.abs(j-aa[i])]=true;
if(j+aa[i]<=sum)
dp[1][j+aa[i]]=true;
}
}
System.arraycopy(dp[1], 0, dp[0], 0, sum+1);//更新
}
sum=0;
for(int i=1;i<dp[0].length;i++)
if(dp[1][i]) {//统计有多少
sum++;
}
out.println(sum);
out.flush();
}
}