P1064 [NOIP2006 提高组] 金明的预算方案(背包)

Posted Harris-H

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了P1064 [NOIP2006 提高组] 金明的预算方案(背包)相关的知识,希望对你有一定的参考价值。

P1064 [NOIP2006 提高组] 金明的预算方案(背包)

选某个附件必须选主件。

就把所有主件都丢进一个数组里。

然后枚举选附件的方案(这个可以状压搜)。

然后就是裸的背包dp了。

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef unsigned long long ull; 
const int N=65,M=4e4+5,inf=0x3f3f3f3f,mod=1e9+7;
const int hashmod[4] = 402653189,805306457,1610612741,998244353;
#define mst(a,b) memset(a,b,sizeof a)
#define PII pair<int,int>
#define PLL pair<ll,ll>
#define x first
#define y second
#define pb emplace_back
#define SZ(a) (int)a.size()
#define rep(i,a,b) for(int i=a;i<=b;++i)
#define per(i,a,b) for(int i=a;i>=b;--i)
#define ios ios::sync_with_stdio(false),cin.tie(nullptr) 
void Print(int *a,int n)
	for(int i=1;i<n;i++)
		printf("%d ",a[i]);
	printf("%d\\n",a[n]); 

template <typename T>		//x=max(x,y)  x=min(x,y)
void cmx(T &x,T y)
	if(x<y) x=y;

template <typename T>
void cmn(T &x,T y)
	if(x>y) x=y;

int dp[M];
int m,n;
vector<int>v[65];
PII a[N];
int cnt;
struct node
	int x,y,id;
b[N];
int main()
	scanf("%d%d",&m,&n);
	rep(i,1,n)
		int q;
		scanf("%d%d%d",&a[i].x,&a[i].y,&q);
		if(!q) b[++cnt] = a[i].x,a[i].y,i;	
		else v[q].pb(i);
	
	for(int i=1;i<=cnt;i++)
		for(int j=m;j>=b[i].x;j--)
			int sz = SZ(v[b[i].id]);
			int tot = 1<<sz;
			for(int k=0;k<tot;k++)
				int sum = b[i].x;
				int val = b[i].x*b[i].y;
				for(int x=0;x<sz;x++)
					if(k>>x&1)
						sum+=a[v[b[i].id][x]].x;
						val+=a[v[b[i].id][x]].x*a[v[b[i].id][x]].y;
					
				
				if(j>=sum) dp[j]=max(dp[j],dp[j-sum]+val);
			
		
	printf("%d\\n",dp[m]);
	return 0;


以上是关于P1064 [NOIP2006 提高组] 金明的预算方案(背包)的主要内容,如果未能解决你的问题,请参考以下文章

[NOIP2006] 提高组 洛谷P1064 金明的预算方案

NOIP提高组2006-金明的预算方案

金明的预算方案 NOIP 2006提高组 分组背包

NOIP2006普及组开心的金明

noip2006 金明的预算方案

noip2006普及组测评数据