hdu 3449 consumer 有依赖的背包问题

前端之家收集整理的这篇文章主要介绍了hdu 3449 consumer 有依赖的背包问题前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

题目链接

题意:

给你一些物品,每个物品有自己的价值和花费,每个物品都对应一个箱子,每个箱子有价钱,买这个物品必须买相应的箱子,给你一个价钱,问最多可以获得多少价值

<提示:多个物品可能同时对应着一个箱子>。


思路;

这道题是一个基础的有依赖的背包问题,也很明显,要想买某个物品,则其对应的箱子必须要买才可以.那么每个箱子是一个主件,每个箱子对应的这些物品为附件.根据背包九讲当中所讲述的,先对每个主件的附件跑一遍01背包,然后再把主件强加到数组里,然后dp最优解.

#include<iostream>
#include<string.h>
#include<stdio.h>
#include<algorithm>
#define Ri(a) scanf("%d",&a)
#define Rl(a) scanf("%lld",&a)
#define Rf(a) scanf("%lf",&a)
#define Rs(a) scanf("%s",a)
#define Pi(a) printf("%d\n",(a))
#define Pf(a) printf("%lf\n",(a))
#define Pl(a) printf("%lld\n",(a))
#define Ps(a) printf("%s\n",(a))
#define W(a) while(a--)
#define CLR(a,b) memset(a,(b),sizeof(a))
#define MOD 100000007
#define inf 0x3f3f3f3f
#define exp 0.00000001
#define  pii  pair<int,int>
#define  mp   make_pair
#define  pb   push_back
using namespace std;
typedef long long ll;
const int maxn=1e5+10;
int n,m;
int dp[maxn],f[maxn];
int main()
{
	int p,cc,v,w;
	while(~Ri(n))
	{ 
	Ri(m);
	CLR(dp,0);
	CLR(f,0);
	for(int i=1;i<=n;i++)
	{
		memcpy(f,dp,sizeof(f));
		Ri(p),Ri(cc);
		for(int j=1;j<=cc;j++)
		{
			Ri(v),Ri(w);
			for(int k=m-p;k>=v;k--)
			f[k]=max(f[k],f[k-v]+w);
		}
		for(int k=m;k>=p;k--)
		dp[k]=max(dp[k],f[k-p]);
	}
	Pi(dp[m]);
	}
	return 0;
}
原文链接:https://www.f2er.com/javaschema/283128.html

猜你在找的设计模式相关文章