HDU 1114 完全背包问题

myhalfsea posted @ 2010年4月30日 06:31 in ACM , 1154 阅读

 

状态转移方程:

if( dp[j-coin[i].w] != MAX && dp[j] > dp[j-coin[i].w] + coin[i].c )
                    dp[j] = dp[j-coin[i].w] + coin[i].c;

 

#include<iostream>
using namespace std;

#define MAX 0X7ffffff
struct node{
    int w;
    int c;
};
node coin[505];
int dp[10005];

int main()
{
    int t, e, f, n;
    int i, j;
    scanf( "%d", &t );
    while( t-- ){
        scanf( "%d %d", &e, &f );
        f -= e;
        scanf( "%d", &n );
        for( i = 0; i < n; i++ )
            scanf( "%d %d", &coin[i].c, &coin[i].w );
        for( dp[0] = 0, i = 1; i <= f; i++ )
            dp[i] = MAX;
        for( i = 0; i < n; i++ )
            for( j = coin[i].w; j <= f; j++ )
                if( dp[j-coin[i].w] != MAX && dp[j] > dp[j-coin[i].w] + coin[i].c )
                    dp[j] = dp[j-coin[i].w] + coin[i].c;
        if( dp[f] == MAX )
            printf("This is impossible.\n");
        else
            printf("The minimum amount of money in the piggy-bank is %d.\n", dp[f]);
    }

    return 0;
}

 


登录 *


loading captcha image...
(输入验证码)
or Ctrl+Enter
Host by is-Programmer.com | Power by Chito 1.3.3 beta
Butterfly Theme | Design: HRS Hersteller of mobile Hundeschule.