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 提高组] 金明的预算方案(背包)的主要内容,如果未能解决你的问题,请参考以下文章