HDU_1114_背包问题

来源:互联网 发布:网络专供靠谱吗 编辑:程序博客网 时间:2024/05/17 01:19

题意就是:给你一定的空间,一定种类的硬币,每种硬币可以重复使用多次,让我们计算消耗这么多的空间的最小质量

dp[i+1][j]表示的就是从前i种硬币中挑选质量小于j的最小价值

转移方程:

dp[i+1][j] = min(dp[i][j],dp[i+1][j-w[i]]+v[i])//选取第i个

#include <iostream>#include <cstdio>#include <cstring>#define MAX_N 505#define MAX_W 10005#define INF 100000000using namespace std;//dp[i+1][j]表示从前i种硬币中挑选质量小于j的最小价值int dp[MAX_N][MAX_W];int n;int W;int v[MAX_N];int w[MAX_N];int t,k;int main(){    //freopen("完全背包A.txt", "r",stdin);    scanf("%d",&t);    k=t;    while(t--)    {        int E,F;        E=F=0;        scanf("%d %d",&E,&F);        W=F-E;        scanf("%d",&n);        for(int i=0;i<n;i++)        {            scanf("%d %d",v+i,w+i);        }        void solve();        solve();    }}void solve(){    //dp[i+1][j]表示从前i种硬币中挑选质量小于j的最小价值    for(int i=0;i<n;i++)    {        for(int j=0;j<=W;j++)        {            dp[i][j]=INF;        }    }    //dp[i+1][j]表示从前i种硬币中挑选质量小于j的最小价值    //初值设置*****  将dp[0][0]设为0;    dp[0][0]=0;    for(int i=0;i<n;i++)    {        for(int j=0;j<=W;j++)        {            if(j<w[i])            {                dp[i+1][j]=dp[i][j];            }            else{                dp[i+1][j]=min(dp[i][j],dp[i+1][j-w[i]]+v[i]);            }        }    }    if(dp[n][W]!=INF)    {        cout<<"The minimum amount of money in the piggy-bank is "<<dp[n][W]<<"."<<endl;    }    else{        cout<<"This is impossible."<<endl;    }}

0 0
原创粉丝点击