给定一组石头,每个石头有一个正数的重量。每一轮开始的时候,选择两个石头一起碰撞,假定两个石头的重量为x,y,x<=y,碰撞结果为:
如果x==y,碰撞结果为两个石头消失
如果x!=y,碰撞结果两个石头消失,生成一个新的石头,新石头重量为y-x
最终最多剩下一个石头为结束。求解最小的剩余石头质量是多少。
数据范围:所有石头的重量总和不超过10000。
注:代码可以继续优化,这里就没有优化了
import java.util.Scanner;
ublic class pengzhuang {
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
int n=sc.nextInt();
int[] tone=new int[n];
int sum=0;
for (int i = 0; i <n ; i++) {
tone[i]=sc.nextInt();
sum+=tone[i];
}
//int average=sum/2;
boolean[][] dp=new boolean[n][sum+1];
//dp[i][j]前i+1个石头能够组成重量为j(当组合出重量为j的石头数不一定等于i)
dp[0][0]=true;
for(int i=1;i<n;i++){
for(int j=0;j<=sum;j++){
dp[i][j]=dp[i-1][j];
if(j>=tone[i]) dp[i][j]|=dp[i-1][j-tone[i]];
}
}
int min=10000;
//相当于分成了两堆,一堆总重量为sum-j,一堆为j,求解出两堆差的最小值
for(int j=0;j<=sum;j++){
if(dp[n-1][j]){
min=Math.min(Math.abs(sum-j-j),min);
}
}
System.out.println(min);
}
}