专栏文章

题解:P11377 [GESP202412 七级] 武器购买

P11377题解参与者 1已保存评论 0

文章操作

快速查看文章及其快照的属性,并进行相关操作。

当前评论
0 条
当前快照
1 份
快照标识符
@miqtm2cp
此快照首次捕获于
2025/12/04 10:32
3 个月前
此快照最后确认于
2025/12/04 10:32
3 个月前
查看原文
题目意思概括:
t组数据,对于每组数据 nn 个物品无法在 QQ 价钱让 总强度 >P> P
思路:背包
1.判断类型
根据样例显然是01背包
2.推导转移方程
(1)让 dpidp_i 为 花费为 ii 时 最大总强度为 dpidp_i
c[i]c[i] 为花费按照思路所以
这时方程为 dpj=max(dpj,dpjc[i]+p[i])dp_j=max(dp_j,dp_{j-c[i]}+p[i])
背包代码如下
CPP
for(int i=1;i<=n;i++)//背包 
{
		for(int j=Q;j>=c[i];j--)
		{
			dp[j]=max(dp[j],dp[j-c[i]]+p[i]);
		}
	}
完整代码如下
温馨提示多测要清空
CPP
#include<bits/stdc++.h>//具体解析见上 
using namespace std;
int t,n,P,Q;
int p[50500],c[50500],dp[50500];//开大点数组好习惯 
int main()
{
	ios::sync_with_stdio(false);//同步 输入输出减少一些时间 
	cin.tie(0);
	cout.tie(0);
	cin>>t;
	while(t--)
	{
		cin>>n>>P>>Q;
		for(int i=1;i<=n;i++)
		{
			cin>>p[i]>>c[i];
		}
		memset(dp,0,sizeof(dp));//多测清空
		for(int i=1;i<=n;i++)//背包 
		{
			for(int j=Q;j>=c[i];j--)
			{
				dp[j]=max(dp[j],dp[j-c[i]]+p[i]);
			}
		}
		if(dp[Q]<P) cout<<"-1\n";//输出
		else 
		{
			for(int i=1;i<=Q;i++)//正序寻找ans 
			{
				if(dp[i]>=P)
				{
					cout<<i<<'\n';
					break;
				}
			}
		}
	}

	return 0;
}
本蒟蒻第一篇题解求过

评论

0 条评论,欢迎与作者交流。

正在加载评论...