魔法宝石

本文详细解析了01背包问题的解决方法,通过一个具体的样例输入和输出,介绍了如何使用动态规划算法来求解最优解,使得在有限的容量下获得最大的价值。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在这里插入图片描述
样例输入
4 6
1 4
2 6
3 12
2 7
样例输出
23
01背包模板;
题意:
如何装物品能让幸运值最大;
Accept Code :

#include <stdio.h>
#include <string.h>
#define max(a,b) a>b?a:b
int v[4005];
int w[4005];
int dp[10050];
int main()
{
	int n,m,i,j,k;
	while(scanf("%d%d", &n,&m)!=EOF)
	{
		memset(dp,0,sizeof(dp));
		for(i=1; i<=n; i++)
			scanf("%d %d", &w[i],&v[i]);
		for(i=1; i<=n; i++)
		{
			for(j=m; j>=w[i]; j--)
			{
				dp[j]=max(dp[j],dp[j-w[i]]+v[i]);
			}
		}
		printf("%d\n", dp[m]);
	}
	return 0;
}
背景故事 在遥远的魔法王国里,拓拓和思思是两位年轻的魔法学徒。他们发现了一串神秘的魔法宝石,每颗宝石都蕴含着不同的魔力值A1,A2,…,AN。为了提升自己的魔法能力,他们决定进行一项挑战: 规则 :每次选择魔力值最小的宝石(如果有多颗魔力值相同,就选最左边的那颗),将它从宝石序列中移除。然后,这颗宝石的魔力会传递给相邻的宝石,使它们的魔力值增加被移除宝石的魔力值。 问题描述 给定一串魔法宝石,初始魔力值为A1,A2,…,AN。拓拓和思思需要执行以下操作K次: 1.选择宝石 :找到当前序列中魔力值最小的宝石。如果有多颗魔力值相同,选择最左边的那颗。 2.移除宝石并传递魔力 : 移除选中的宝石。 如果这颗宝石左边有相邻宝石 ,则左边宝石的魔力值增加被移除宝石的魔力值。 如果这颗宝石右边有相邻宝石 ,则右边宝石的魔力值增加被移除宝石的魔力值。 最终,输出K次操作后剩下的宝石序列。 输入格式 第一行包含两个整数N和K。 第二行包含N个整数,A1,A2,A3,…,AN。 输出格式 输出N-K个整数,中间用一个空格隔开,代表K次操作后的宝石序列。 样例 输入数据#1 5 3 1 4 2 8 7 输出数据#1 17 7 解释#1 数列变化如下,中括号里的数是当次操作中被选择的数: [1] 4 2 8 7 5 [2] 8 7 [7] 10 7 17 7 数据范围 对于20%的数据,1≤K<N≤10000。 对于100%的数据,1≤K<N≤10^5,0≤Ai≤10^8。 c++
03-31
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

皮皮皮皮皮皮皮卡乒

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值