背包问题 动态规划 HDOJ1114

/*

题目描述:无界背包问题。给定一个背包的容量W以及n种物品的价值p[i]及重量w[i],求使背包恰好装满

的物品价值的最大值,如不存在,则输出impossible。



HDOJ 1114



*/



#include<iostream>

#include<vector>

#include<assert.h>

#include<cstring>

using namespace std;



const int N = 500+10;



struct Coin

{

    int price;

    int weight;

};



Coin coin[N];

int f[10000+10]; //f[i]表示背包的容量为i时所能得到的最小值。

const int INF = 10000000;



int main()

{

    

    int t = 0; //测试组数

    int n = 0; //硬币种数

    int E = 0; //储蓄罐空时的重量

    int F = 0; //储蓄罐满时的重量

    int totalWeight = 0; 

    int i = 0;

    int j = 0;

    cin>>t;

    while (t--)

    {

        cin>>E>>F;

        totalWeight = F - E;



        cin>>n;

        for (i=0; i<n; i++)

        {

            cin>>coin[i].price>>coin[i].weight;

        }



        for(i=0; i<=totalWeight; i++)

            f[i] = INF;



        //容量为0时硬币价值的最小值为0;

        f[0] = 0;



        //对每个硬币都尝试装多次。

        for (i=0; i<n; i++)

            for (j=coin[i].weight; j<=totalWeight; j++)

            {

                if (f[j] > (f[j-coin[i].weight] + coin[i].price ) )

                {

                    f[j] = f[j-coin[i].weight] + coin[i].price;

                }

                

            }

        



        if (f[totalWeight] == INF)

        {

            //尝试了所有硬币都不能将其恰好装满。

            cout<<"This is impossible."<<endl;

        } 

        else

        {

            cout<<"The minimum amount of money in the piggy-bank is "<<f[totalWeight]<<"."<<endl;

        }

    }

    return 0;

}

你可能感兴趣的:(动态规划)