hdu5445 Food Problem(背包)

来源:互联网 发布:js在线解压缩工具下载 编辑:程序博客网 时间:2024/05/21 09:58

hdu5445

题目

就是要获得一定量的能量,通过食物,食物有数量以及体积,然后用车子装食物,车子有花费和数量,求在目标能量下的最小花费。

思路

首先就是要写两次背包,第一次求出最小体积,第二次球最小花费,还有就是题目给出最大花费不超过50000,要围绕这个,别的姿势可能会超。

代码

#include<iostream>#include<cstring>#include<cstdio>#include<vector>#include<stack>#include<cstdlib>#include<algorithm>#include<cmath>using namespace std;typedef long long ll;const int maxn=1010;const int maxm=51000;int t[maxn],u[maxn],v[maxn];int x[maxn],y[maxn],z[maxn];int dp[maxm];int dp2[51000];int main(){    int T;    scanf("%d",&T);    while(T--)    {        int n,m,p;        int sum=0;        scanf("%d %d %d",&n,&m,&p);        for(int i=0; i<n; i++)            scanf("%d %d %d",&t[i],&u[i],&v[i]);        for(int i=0; i<m; i++)        {            scanf("%d %d %d",&x[i],&y[i],&z[i]);            sum+=x[i]*z[i];        }        memset(dp,0x3f3f3f3f,sizeof(dp));        dp[0]=0;        for(int i=0; i<n; i++)        {            int num=v[i];            int ba=1;            while(num>=ba)            {                int energy=t[i]*ba;                int siz=u[i]*ba;                for(int i=p+100; i>=energy; i--)                    dp[i]=min(dp[i],dp[i-energy]+siz);                num-=ba;                ba*=2;            }            if(num>0)            {                int energy=t[i]*num;                int siz=u[i]*num;                for(int i=p+100; i>=energy; i--)                    dp[i]=min(dp[i],dp[i-energy]+siz);            }        }        int minsize=0x3f3f3f3f;        for(int i=p; i<=p+100; i++)            minsize=min(minsize,dp[i]);        if(sum<minsize||minsize==0x3f3f3f3f)        {            printf("TAT\n");            continue;        }        int mincost=0x3f3f3f3f;        memset(dp2,0,sizeof(dp2));        for(int i=0; i<m; i++)        {            int num=z[i];            int ba=1;            while(num>=ba)            {                int carry=x[i]*ba;                int cost=y[i]*ba;                for(int i=50000; i>=cost; i--)                {                    dp2[i]=max(dp2[i],dp2[i-cost]+carry);                    if(dp2[i]>=minsize)                    {                        mincost=min(mincost,i);                    }                }                num-=ba;                ba*=2;            }            if(num>0)            {                int carry=x[i]*num;                int cost=y[i]*num;                for(int i=50000; i>=cost; i--)                {                    dp2[i]=max(dp2[i],dp2[i-cost]+carry);                    if(dp2[i]>=minsize)                    {                        mincost=min(mincost,i);                    }                }            }        }        if(mincost!=0x3f3f3f3f)            printf("%d\n",mincost);        else            printf("TAT\n");    }    return 0;}
0 0
原创粉丝点击