【SHNU_RUSHer】动态规划 [Cloned]X - 悼念512汶川大地震遇难同胞――珍惜现在,感恩生活【含多重背包转01背包的模板】

X - 悼念512汶川大地震遇难同胞――珍惜现在,感恩生活【含多重背包转01背包的模板】

[by_041]

题目链接_shnu_OJ

(前段时间比较有事做,好久莫得刷题,手都快生了,不对劲,回来刷刷)

题目理解

  • 这题是道裸的多重背包模板题:物品有价格价值数量,将其用01背包的做法做的代码模板如下:

int n;	// 有的资金
int m;	// 商品个数

struct goods_	// 产品信息
{
    
    
	int price,value,number;
}g[M_max+1];

int dp[N_max+1];	//dp[i]表示用i元能得到的最多的产品价值


...	// 输入部分,下标都从1开始

for(int i=1;i<=m;i++)
		{
    
    
	    	for(int j=g[i].number;j;j--)
				{
    
    
					for(int k=n-g[i].price;~k;k--)
					{
    
    
						dp[k+g[i].price]=maxx(dp[k+g[i].price],dp[k]+g[i].value);
					}
				}
		}
printf("%d\n",dp[n]);	// 输出最大价值

然后就是AC码了:

#include<cstdio>

int maxx(int a,int b)
{
    
    return a>b?a:b;}

struct rice_
{
    
    
	int price,heavy,contain;
}r[111];


int dp[107];	//dp[i]表示用i元能买到的最大大米数量

int main()
{
    
    
	int T,n,m;
	scanf("%d",&T);
	while(T--)
	{
    
    
		scanf("%d%d",&n,&m);
		for(int i=0;i<=n;i++)
			dp[i]=0;
		for(int i=1;i<=m;i++)
		{
    
    
			scanf("%d%d%d",&r[i].price,&r[i].heavy,&r[i].contain);
		}
		// for(int i=1;i<=m;i++)
		// 	printf("%d %d %d\n",r[i].price,r[i].heavy,r[i].contain);
		for(int i=1;i<=m;i++)
		{
    
    
			for(int j=r[i].contain;j;j--)
				{
    
    
					for(int k=n-r[i].price;~k;k--)
					{
    
    
						dp[k+r[i].price]=maxx(dp[k+r[i].price],dp[k]+r[i].heavy);
					}
				}
		}
		// for(int i=0;i<=n;i++)
		// 	printf("dp[%2d ] : %d\n",i,dp[i]);
		printf("%d\n",dp[n]);
	}
	return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_42710619/article/details/111032364