zju 2014/ hdoj 1114-Piggy-Bank

来源:互联网 发布:方丈wtybill知乎百科 编辑:程序博客网 时间:2024/04/30 03:11
/*
zju 2014/ hdoj 1114-Piggy-Bank
written by lky
4    lky     109MS    0K    916B    C++    2008-03-06 14:48:16

动态规划->
  状态表示:dp[i]表示容量为i时达到的最小值,如果不可能则是-1
  状态转移:由dp[i]产生出dp[k],
           dp[k] = min(dp[k], dp[i]+a[j].v)       dp[k]!=-1
           dp[k] = dp[i]+a[j].v                   dp[k] =-1
           (k = i+a[j].w,  j=1-n, k<=m)
  优化:先根据物品的重量从小到大的排序,然后再dp  
*/
#include<iostream>
#include <algorithm>
using namespace std;
struct Item
{
    int v,w;
};
bool comp(Item i1, Item i2)
{
    if(i1.w < i2.w)
        return true;
    return false;
}
int main()
{
    int dp[10001];
    Item a[501];
    int n, m, N;
    int i, j, k;
    int m1, m2;
    scanf("%d", &N);
    while (N--)
    {
        scanf("%d%d", &m1, &m2);
        m = abs(m1-m2);
        scanf("%d", &n);
        for (i=0; i<n; ++i)
        {
            scanf("%d%d",&a[i].v, &a[i].w);
        }
        memset(dp, -1, sizeof(dp));
        dp[0] = 0;
        sort(a, a+n, comp);
        for (i=0; i<=m; ++i)
        {
            if(dp[i] != -1)
            {
                for (j=0; j<n; ++j)
                {
                    k = i + a[j].w;
                    if(k > m)
                        break;
                    if(dp[k]==-1 || dp[k] > dp[i]+a[j].v)
                        dp[k] = dp[i]+a[j].v;
                }
            }
        }
        if(dp[m] == -1)
            printf("This is impossible./n");
        else
            printf("The minimum amount of money in the piggy-bank is %d./n", dp[m]);
    }
    return 0;
}