zoukankan      html  css  js  c++  java
  • dp之多维背包hdu4501

    思路:将v1,v2,k都当作一种体积,每种物品只能取一次,求max.......

    反思:以前写背包,由于只有一个体积,所以习惯性的在for中,就所取的最小值限制,而在这次,因为这里导致wa了,具体是因为在多个体积限制的背包里,当这个体积小于它的最小体积时,它可以不去减它的最小体积,而是作为一种状态来传递其他体积的限制的值........

    wa代码:

    #include<iostream>
    #include<stdio.h>
    #include<string.h>
    using namespace std;
    int dp[105][105][110],s[105][3];
    int max(int x,int y)
    {
        if(x>y)
        return x;
        else
        return y;
    }
    int main()
    {
        int n,v1,v2,k;
        while(scanf("%d%d%d%d",&n,&v1,&v2,&k)>0)
        {
            for(int i=1;i<=n;i++)
            scanf("%d%d%d",&s[i][0],&s[i][1],&s[i][2]);
            memset(dp,0,sizeof(dp));
            for(int i=1;i<=n;i++)
            {
                for(int j=v1;j>=s[i][0];j--)
                {
                    for(int p=v2;p>=s[i][1];p--)
                    {
                        for(int q=k;q>=0;q--)
                        {
                            int maxx=0;
                            if(maxx<dp[j-s[i][0]][p][q]+s[i][2])
                            maxx=dp[j-s[i][0]][p][q]+s[i][2];
                            
                            if(maxx<dp[j][p-s[i][1]][q]+s[i][2])
                            maxx=dp[j][p-s[i][1]][q]+s[i][2];
                            
                            if(q>0&&maxx<dp[j][p][q-1]+s[i][2])
                            maxx=dp[j][p][q-1]+s[i][2];
                            
                            if(maxx<dp[j][p][q])
                            maxx=dp[j][p][q];
                            dp[j][p][q]=maxx;
                        }
                    }
                }
            }
            printf("%d
    ",dp[v1][v2][k]);
        }
        return 0;
    }
    

     ac代码:

    #include<iostream>
    #include<stdio.h>
    #include<string.h>
    using namespace std;
    int dp[105][105][110],s[105][3];
    int max(int x,int y)
    {
    	if(x>y)
    	return x;
    	else
    	return y;
    }
    int main()
    {
    	int n,v1,v2,k;
    	while(scanf("%d%d%d%d",&n,&v1,&v2,&k)>0)
    	{
    		for(int i=1;i<=n;i++)
    		scanf("%d%d%d",&s[i][0],&s[i][1],&s[i][2]);
    		memset(dp,0,sizeof(dp));
    		for(int i=1;i<=n;i++)
    		{
    			for(int j=v1;j>=0;j--)
    			{
    				for(int p=v2;p>=0;p--)
    				{
    					for(int q=k;q>=0;q--)
    					{
    						int maxx=0;
    						if(j>=s[i][0]&&maxx<dp[j-s[i][0]][p][q]+s[i][2])
    						maxx=dp[j-s[i][0]][p][q]+s[i][2];
    						
    						if(p>=s[i][1]&&maxx<dp[j][p-s[i][1]][q]+s[i][2])
    						maxx=dp[j][p-s[i][1]][q]+s[i][2];
    						
    						if(q>0&&maxx<dp[j][p][q-1]+s[i][2])
    						maxx=dp[j][p][q-1]+s[i][2];
    						
    						if(maxx<dp[j][p][q])
    						maxx=dp[j][p][q];
    						dp[j][p][q]=maxx;
    					}
    				}
    			}
    		}
    		printf("%d
    ",dp[v1][v2][k]);
    	}
    	return 0;
    }
    
  • 相关阅读:
    Windows批处理方式实现MySQL定期自动备份多个数据库
    MySQL数据库中库、表名、字段的大小写问题
    使用modbus4j通过串口解析modbus协议(java)
    mybatis —— 动态sql之if条件判断各种使用方式
    Mysql 获取表的comment 字段
    [转载]如何判断数据库,表或字段是否存在
    设计模式目录
    图片上传及访问
    实现第一个API
    ListView 源码解析
  • 原文地址:https://www.cnblogs.com/ziyi--caolu/p/3217151.html
Copyright © 2011-2022 走看看