0
点赞
收藏
分享

微信扫一扫

金明的预算方案-有依赖的背包问题

跟着Damon写代码 2022-05-03 阅读 61
c++

P1064 [NOIP2006 提高组] 金明的预算方案 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

#include<bits/stdc++.h>
using namespace std;
const int N=2e5+10;
int n,m;
int f[N],g[N],v[N],w[N],team[N];

int main(){
	scanf("%d %d",&n,&m);
	for(int i=1;i<=m;i++){
		int a,b,c;
		scanf("%d %d %d",&a,&b,&c);
		v[i]=a,w[i]=a*b,team[i]=c;
	}
	for(int i=1;i<=m;i++){
		if(team[i]==0){
			for(int j=1;j<v[i];j++) g[j]=0;
			for(int j=v[i];j<=n;j++){
				g[j]=f[j-v[i]]+w[i];
			}
			for(int j=1;j<=m;j++){
				if(team[j]==i){
					for(int k=n;k>=v[i]+v[j];k--){
						g[k]=max(g[k],g[k-v[j]]+w[j]);
					}
				}
			}
			for(int j=v[i];j<=n;j++) f[j]=max(f[j],g[j]);
		}
	}
	printf("%d\n",f[n]);
}
举报

相关推荐

0 条评论