hdu4501-注意小细节(我的惯性写法)

来源:互联网 发布:stm8 c语言编程 编辑:程序博客网 时间:2024/05/01 21:04

这一题就是把v1,v2和免费商品都看成是他们的背包容积,而这三者之间相互不影响,所以可以用三维的01背包来做。而我一开始的写法是循环:从最大容积到物品的容积;而在这一题中这种写法是错误的,因为即使小于其中一个容积也有可能符合另外的几个容积,例如即使是钱不够了,我也可以用积分或者是免费商品来买

#include<cstdio>#include<cstring>#include<iostream>using namespace std;const int maxn=101;int dp[101][101][6];struct thing{    int v1,v2,t;};int Max(int a,int b){    return a>b?a:b;}thing s[maxn];int main(){    //freopen("in.txt","r",stdin);    int n,v1,v2,p;    while(~scanf("%d%d%d%d",&n,&v1,&v2,&p))    {        memset(dp,0,sizeof(dp));        int MAX=-1;        for(int i=0;i<n;i++)        {            scanf("%d%d%d",&s[i].v1,&s[i].v2,&s[i].t);        }        for(int i=0;i<n;i++)        {            for(int j=v1;j>=0;j--)            {                for(int k=v2;k>=0;k--)                {                    for(int num=p;num>=0;num--)                    {                        int temp=0;                        if(j>=s[i].v1)                            temp=Max(temp,dp[j-s[i].v1][k][num]+s[i].t);                        if(k>=s[i].v2)                            temp=Max(temp,dp[j][k-s[i].v2][num]+s[i].t);                        if(num>0)                            temp=Max(temp,dp[j][k][num-1]+s[i].t);                        dp[j][k][num]=Max(dp[j][k][num],temp);                    }                }            }        }        printf("%d\n", dp[v1][v2][p]);    }    return 0;}


0 0