• 多重背包hdu2191,完全背包hdu4508,二维费用背包hdu2159


    /*
    多重背包,用2进制的拆分思想,转化为01背包
    */
    #include<cstdio>
    #include<cstring>
    #define maxn 99999
    #define max(a,b) (a)>(b)?(a):(b)
    int dp[maxn],c[maxn],v[maxn];
    int main()
    {
    	int Z,V,m,i,a,b,x,j;
    	scanf("%d",&Z);
    	while(Z--)
    	{
    		scanf("%d%d",&V,&m);
    		int cnt=1;
    		for(i=1;i<=m;i++)
    		{
    			scanf("%d%d%d",&a,&b,&x);
    			int t=1;
    			while(x>=t)
    			{
    				v[cnt]=a*t;
    				c[cnt++]=b*t;
    				x-=t;
    				t<<1;
    			}
    			if(x)
    			{
    				v[cnt]=a*x;
    				c[cnt++]=b*x;
    			}
    		}
    		memset(dp,0,sizeof(dp));
    		for(i=1;i<cnt;i++)
    			for(j=V;j>=v[i];j--)
    				dp[j]=max(dp[j],dp[j-v[i]]+c[i]);
    		printf("%d\n",dp[V]);
    	}
    	return 0;
    }



    /*
    完全背包
    转化为可重复的01背包
    */
    #include<cstdio>
    #include<cstring>
    #define max(a,b) (a)>(b)?(a):(b)
    #define maxn 100010
    int dp[100010];
    int main()
    {
    	int n,i,j,V;
    	int c[200],v[200];
    	while(scanf("%d",&n)!=EOF)
    	{
    		memset(dp,0,sizeof(dp));
    		for(i=1;i<=n;i++)
    			scanf("%d%d",&c[i],&v[i]);
    		scanf("%d",&V);
    		for(i=1;i<=n;i++)
    			for(j=v[i];j<=V;j++)
    				dp[j]=max(dp[j],dp[j-v[i]]+c[i]);
    		printf("%d\n",dp[V]);
    	}
    	return 0;
    }
    /*
    二维费用背包
    变形较多。三重循环较难掌握。
    */
    #include<cstdio>
    #include<cstring>
    #define maxn 150
    #define max(a,b) (a)>(b)?(a):(b)
    int main()
    {
    	int c[maxn],v[maxn],dp[maxn][maxn];
    	int ex,pa,ki,mm,i,j,k;
    	while(scanf("%d%d%d%d",&ex,&pa,&ki,&mm)!=EOF)//experience,patience,kinds,mostmonserts
    	{
    		int f=1;
    		memset(dp,0,sizeof(dp));
    		for(i=1;i<=ki;i++)
    			scanf("%d%d",&c[i],&v[i]);
    		for(i=1;i<=ki;i++)
    			for(j=v[i];j<=pa;j++)
    				for(k=1;k<=mm;k++)
    					dp[j][k]=max(dp[j][k],dp[j-v[i]][k-1]+c[i]);
    		for(i=1;i<=pa;i++)
    			for(k=1;k<=mm;k++)
    				if(dp[i][k]>=ex)
    				{
    					f=0;
    					printf("%d\n",pa-i);
    					goto A;
    				}
    		if(f)
    			printf("-1\n");
    		A:;
    	}
    	return 0;
    }
    


  • 相关阅读:
    SqlServer存储过程调用接口
    Zend引擎探索 之 PHP中前置递增不返回左值
    在CentOS上为Docker开启SELinux
    PSR-4 自动加载器
    [译]漫画SELinux概念
    NodeMCU Builder, yet another NodeMCU IDE
    Mac OS X更新VirtualBox以后Genymotion无法启动的一种情况
    Win32API起始处的mov edi, edi与用户空间InlineHook
    DLL的导出函数重定向机制
    一个Win32API Trace Tool的设计与实现
  • 原文地址:https://www.cnblogs.com/javawebsoa/p/3041149.html
Copyright © 2020-2023  润新知