背包 0 分求助,悬赏一关注
查看原帖
背包 0 分求助,悬赏一关注
255077
麦克斯韦の妖楼主2022/9/24 21:10
#include<cstdio>
#include<iostream>
#include<string.h>
#include<cmath>
#include<algorithm>
#include<queue>
#include<deque>
#include<vector>
#include<set>
#include<stack>
#include<map>
#include<assert.h>
#define ls o<<1
#define rs o<<1|1
using namespace std;
typedef long long ll;
const int INF=0x3f3f3f3f;
const int N=500+10;
void read(int &x){
    int fx=1;
	x=0;
	char ch=getchar();
    while(ch<'0'||ch>'9'){if(ch=='-') fx=-1;ch=getchar();}
    while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
    x=x*fx;
}
struct Node{
	int cost,fr,be;
}a[N];
int n,q;
int dp[N][N]; // dp[i][j] 表示新鲜度为 i ,花费为 j 时的最大美丽程度。
int ans[N][N]; // ans[i][j] 表示花费不超过 i ,新鲜度大于等于 j 的最大美丽程度。 
int main()
{
	read(n);
	read(q);
	for(int i=1;i<=n;i++)
	{
		read(a[i].cost);
		read(a[i].fr);
		read(a[i].be);
	}
	for(int i=1;i<=n;i++)
	{
		for(int v=500;v>=a[i].cost;v--)
		{
			for(int f=500;f>=a[i].fr;f--)
			{
				dp[v][f]=max(dp[v][f],dp[v-a[i].cost][f-a[i].fr]+a[i].be);
			}
		}
	} 		
	for(int j=0;j<=500;j++)
	{
		for(int k=j;k<=500;k++)
		{
			ans[0][j]=max(ans[0][j],dp[0][k]);
		}
	}
	for(int i=1;i<=500;i++)
	{
		for(int j=0;j<=500;j++)
		{
			for(int k=j;k<=500;k++)
			{
				ans[i][j]=max(ans[i-1][j],dp[i][k]);
			}
		}
	}
	for(int i=1;i<=q;i++)
	{
		int c,f;
		read(c);
		read(f);
		printf("%d\n",ans[c][f]);
	}
}


2022/9/24 21:10
加载中...