NYOJ 456 郵票分你一半
阿新 • • 發佈:2019-02-20
郵票分你一半 時間限制:1000 ms | 記憶體限制:65535 KB 難度:3 描述 小珂最近收集了些郵票,他想把其中的一些給他的好朋友小明。每張郵票上都有分值,他們想把這些郵票分成兩份,並且使這兩份郵票的分值和相差最小(就是小珂得到的郵票分值和與小明的差值最小),現在每張郵票的分值已經知道了,他們已經分好了,你知道最後他們得到的郵票分值和相差多少嗎? 輸入 第一行只有一個整數m(m<=1000),表示測試資料組數。 接下來有一個整數n(n<=1000),表示郵票的張數。 然後有n個整數Vi(Vi<=100),表示第i張郵票的分值。 輸出 輸出差值,每組輸出佔一行。 樣例輸入 2 5 2 6 5 8 9 3 2 1 5 樣例輸出 0 2 #include<stdio.h> #include<string.h> int main() { int i,j,k,l,n,m,a[100005],b[100005]; scanf("%d",&m); while(m--) { scanf("%d",&n); memset(b,0,sizeof(b)); memset(a,0,sizeof(a)); int sum=0; for(i=1;i<=n;i++) { scanf("%d",&a[i]); sum+=a[i]; } for(i=1;i<=n;i++) { for(j=sum/2;j>=a[i];j--) { if(b[j]<=b[j-a[i]]+a[i]) b[j]=b[j-a[i]]+a[i]; } } printf("%d\n",sum-2*b[sum/2]); }return 0; } 思路詳解:先把郵票的總分數平分,得出sum/2;用來儲存郵票的各種最小相加接近於平分數的最優解,即儲存的總和數不能大於b陣列的下標,最後一個階段的b的最大下標的 值即為最接近平分數的值