萌新初学背包,RE求助
查看原帖
萌新初学背包,RE求助
421265
eastcloud楼主2022/5/22 16:26
#include<iostream>
#include<cmath>
#include<algorithm>
#include<cstring>
#include<cstdio>
using namespace std;
int tot,all;
int d[201],p[201];
int dp[201][881];
int last[881][881];
struct Node{
	int next,val;
}edge[80001];
void dfs(int x,int sum1,int sum2){
	if(x==0){
		cout<<"Best jury has value "<<sum1<<" for prosecution and value "<<sum2<<" for defence:"<<endl;
		return;
	}
	dfs(edge[x].next,sum1+d[edge[x].val],sum2+p[edge[x].val]);
	cout<<' '<<edge[x].val;
}
int main(){
	int n,m;
	cin>>n>>m;
	while(n && m){
		tot++;
		cout<<"Jury #"<<tot<<endl;
		all=0;
		for(int i=1;i<=n;i++) cin>>d[i]>>p[i];
		memset(dp,0xcf,sizeof(dp));
		memset(last,0,sizeof(last));
		dp[0][400]=0;
		for(int i=1;i<=n;i++){
			for(int j=m;j>0;j--){
				int maxn=(d[i]-p[i]);
				for(int k=-400;k<=400;k++){
					if(k-maxn+400>800 || k-maxn+400<0) continue;
					if(dp[j][k+400]<dp[j-1][k-maxn+400]+d[i]+p[i]){
						dp[j][k+400]=dp[j-1][k-maxn+400]+d[i]+p[i];
						edge[++all].val=i;
						edge[all].next=last[j-1][k-maxn+400];
						last[j][k+400]=all;
					}
				}
			}
		}
		for(int i=0;i<=400;i++){
			if(dp[m][400+i]>=0 || dp[m][400-i]>=0){
				if(dp[m][400+i]>dp[m][400-i]) dfs(last[m][400+i],0,0);
				else dfs(last[m][400-i],0,0);
				cout<<endl<<endl;
				break;
			}
		}
		cin>>n>>m;
	}
    return 0;
}
2022/5/22 16:26
加载中...