依赖背包绿题wa1点求调
  • 板块学术版
  • 楼主Erica_N_Contina
  • 当前回复3
  • 已保存回复3
  • 发布时间2023/11/14 22:42
  • 上次更新2023/11/15 11:04:03
查看原帖
依赖背包绿题wa1点求调
562423
Erica_N_Contina楼主2023/11/14 22:42

https://www.luogu.com.cn/problem/P1064 求调,wa一个点。后附。


#include<bits/stdc++.h>
using namespace std;
#define int long long
#define mp make_pair

#define rd read()
inline int rd
{
	int xx=0,ff=1;
	char ch=getchar();
	while(ch<'0'||ch>'9') {if(ch=='-') ff=-1;ch=getchar();}
	while(ch>='0'&&ch<='9') xx=xx*10+(ch-'0'),ch=getchar();
	return xx*ff;
}
inline void write(int out)
{
	if(out<0) putchar('-'),out=-out;
	if(out>9) write(out/10);
	putchar(out%10+'0');
}


// void solve(){

//     cerr<<"\nlong longrr[][]=";
//     for(int i=1;i<=n;i++)cerr<<t[i].lst<<' '<<t[i].r<<endl;
// }



const int N=1e2+5;
 const int M=5e4+5;
const int INF=2e9+5;
const int MOD=2e9+7;
bool f1;

int p[N],v[N],dp[N][M],n,m,k,cnt,ans,id[N],q[N];
vector<int> e[N];

signed main(){
	
	n=rd,m=rd;
	for(int i=1;i<=m;i++){
		v[i]=rd;p[i]=rd;q[i]=rd;
		if(q[i])e[q[i]].push_back(i);
		else id[++cnt]=i;
	}
	for(int i=1;i<=cnt;i++){
		for(int j=0;j<=n;j++){
			dp[i][j]=dp[i-1][j];//继承
			if(j>=v[id[i]])dp[i][j]=max(dp[i][j],dp[i-1][j-v[id[i]]]+p[id[i]]*v[id[i]]);//转移
			if(e[id[i]].size()==1){
				int vv=v[id[i]]+v[e[id[i]][0]];//主+附件1
				int ww=p[id[i]]*v[id[i]]+p[e[id[i]][0]]*v[e[id[i]][0]];
				if(j>=vv)dp[i][j]=max(dp[i][j],dp[i-1][j-vv]+ww);
			}
			if(e[id[i]].size()==2){
				int vv=v[id[i]]+v[e[id[i]][1]];//主+附件2
				int ww=p[id[i]]*v[id[i]]+p[e[id[i]][1]]*v[e[id[i]][1]];
				if(j>=vv)dp[i][j]=max(dp[i][j],dp[i-1][j-vv]+ww);

				vv+=v[e[id[i]][0]];//主+附件1,2
				ww+=p[e[id[i]][0]]*v[e[id[i]][0]];
				if(j>=vv)dp[i][j]=max(dp[i][j],dp[i-1][j-vv]+ww);
			}
		}

	}
	for(int i=0;i<=n;i++)ans=max(ans,dp[cnt][i]);
	
	cout<<ans<<endl;

	return 0;
}
/*

*/

in

2000 10
500 1 0
400 4 0
300 5 1
400 5 1
200 5 0
500 4 5
400 4 0
320 2 0
410 3 0
400 3 5

out

7400

ans

7430
2023/11/14 22:42
加载中...