1 条题解
-
0
C :
#include<stdio.h> #include<string.h> int n,sum,dp[55][45010]; int abs(int x) { return x>0?x:-x; } void add(int x) { int i,j; for(i=n/2-1;i>=0;i--) { for(j=0;j<=sum;j++) { if(dp[i][j]) { if(j+x<45010) dp[i+1][j+x]=1; } } } } int main() { int i,a,ans; while(scanf("%d",&n)!=EOF) { sum=0; memset(dp,0,sizeof(dp)); dp[0][0]=1; for(i=0;i<n;i++) { scanf("%d",&a); sum+=a; add(a); } ans=sum; for(i=0;i<=sum;i++) { if(dp[n/2][i]) { if(abs(sum-i-i)<ans) ans=abs(sum-i-i); } } printf("%d %d\n",(sum-ans)/2,(sum-ans)/2+ans); } return 0; }
C++ :
#include<stdio.h> #include<string.h> int n,sum,dp[55][45010]; int abs(int x) { return x>0?x:-x; } void add(int x) { int i,j; for(i=n/2-1;i>=0;i--) { for(j=0;j<=sum;j++) { if(dp[i][j]) { if(j+x<45010) dp[i+1][j+x]=1; } } } } int main() { int i,a,ans; while(scanf("%d",&n)!=EOF) { sum=0; memset(dp,0,sizeof(dp)); dp[0][0]=1; for(i=0;i<n;i++) { scanf("%d",&a); sum+=a; add(a); } ans=sum; for(i=0;i<=sum;i++) { if(dp[n/2][i]) { if(abs(sum-i-i)<ans) ans=abs(sum-i-i); } } printf("%d %d\n",(sum-ans)/2,(sum-ans)/2+ans); } return 0; }
Java :
import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner in = new Scanner(System.in); while (in.hasNextInt()) { int n = in.nextInt(); int[] w = new int[n + 1]; int sum = 0; for (int i = 1; i <= n; i++) { w[i] = in.nextInt(); sum += w[i]; } int ave = sum / 2; int[] f = new int[ave + 1]; for (int i = 1; i <= n; i++) { for (int j = ave; j >= w[i]; j--) { f[j] = Math.max(f[j], f[j - w[i]] + w[i]); } } int t1 = f[ave]; int t2 = sum - f[ave]; if (t1 <= t2) System.out.println(t1 + " " + t2); else System.out.println(t2 + " " + t1); } } }
- 1
信息
- ID
- 741
- 时间
- 3000ms
- 内存
- 32MiB
- 难度
- (无)
- 标签
- 递交数
- 0
- 已通过
- 0
- 上传者