hdu 1171 Big Event in HDU 백팩/동적 계획

4549 단어 event
제목의 대의.
N개 물품, 매 물품의 가치는 a[i]이고 수량은 b[i]입니다. 두 무더기로 나누면 차액이 최대한 적습니다.
문제풀이의 방향
다중 가방의 변형인 것 같아요~~~
상태 DP[N][V]는 앞의 i개 물품, 가치가 V인 방안의 수를 나타낸다
전이 방정식
    dp[i][ j+k*a[i] ] += dp[i-1][j]  //k = 0..b[i]
  
#include<stdio.h>

#include<stdlib.h>

#include<string.h>



const int N = 250010;



int dp[2][N];

int main(){

    

    int a[110], b[110], n;

    while( scanf("%d",&n) != EOF){

        if( n < 0 ) break;

        memset( dp, 0, sizeof(dp));

        dp[0][0] = 1;

        int V = 0;

        for(int i = 1; i <= n; i++){

            scanf("%d%d",a+i,b+i);

            V += a[i]*b[i];    

        }    

        for(int i = 1; i <= n; i++){ // 50

            int cur = (i+1)&1, nxt = i&1;

            memset( dp[nxt], 0, sizeof(dp[nxt]));

            for(int j = 0; j <= V; j++){ // 250000

                for(int k = 0; k <= b[i] && (k*a[i]+j)<=V; k++) //100

                    dp[nxt][ k*a[i]+j ] += dp[cur][j];    

            }    

        }

        for(int i = V/2; i <= V; i++){

            if( dp[n&1][i] ){

                int ans = (i>V-i)?i:V-i;

                printf("%d %d
", ans, V-ans ); break; } } } return 0; }

좋은 웹페이지 즐겨찾기