0-1背包问题,将N袋糖果分成两份,使得两份的糖果数一样。输出每份的糖果数,以及每份的糖果中,每袋的颗数。
import java.util.HashMap;
import java.util.Scanner;
public class Test {
public static void main(String[] args){
Scanner in=new Scanner(System.in);
int N=in.nextInt();
int[] nums=new int[N];
int sum=0;
for(int i=0;i<N;i++){
nums[i]=in.nextInt();
sum+=nums[i];
}
if(sum%2==1){
System.out.println(-1);
return;
}
sum/=2;
HashMap<Integer,int[]> map=new HashMap<>();
boolean[] dp=new boolean[sum+1];
dp[0]=true;
map.put(0,new int[]{});
for(int i=1;i<=N;i++){
for(int j=sum-1;j>=nums[i-1];j--){
if(dp[j]){
continue;
}
dp[j]=dp[j-nums[i-1]];
if(dp[j]){
int[] oldArray=map.get(j-nums[i-1]);
int[] newArray=new int[oldArray.length+1];
System.arraycopy(oldArray,0,newArray,0,oldArray.length);
newArray[oldArray.length]=i-1;
map.put(j,newArray);
if(j==sum){
break;
}
}
}
}
if(dp[sum]){
boolean[] flags=new boolean[N];
for(int x:map.get(sum)){
flags[x]=true;
}
StringBuilder str1=new StringBuilder();
StringBuilder str2=new StringBuilder();
for(int i=0;i<N;i++){
if(flags[i]){
str1.append(nums[i]+" ");
}else{
str2.append(nums[i]+" ");
}
}
System.out.println(sum);
System.out.println(str1);
System.out.println(str2);
}else{
System.out.println(-1);
}
}
}