csp-何以包邮202209-2满分题解

文章分享了解答编程题目中关于书籍包邮问题的经验,从最初的循环枚举到递归求解,最后通过优化递归方法,使用减法实现高效解决,仅用15ms得到100分的解决方案。

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

本人是一名小白,在此分享一下自己的见解,如有问题还请不吝指正。

首先,题目已经提示了用直接枚举,因此我一开始用循环尝试骗分,结果2个循环n选2全部情况得来10分,然后8个循环n选8组合得了15分,据此猜测要包邮的书本数极大,然后我把循环改成递归就能枚举全部情况,果然只有70分,运行超时,因此把加法递归改成减法递归,果然有100分了,并且只用了15ms,代码如下:

#include<stdio.h>
int min,x,sum=0;
void PostPrice(int b[],int n,int s,int j);
int main()
{
	int n,m=0;
	scanf("%d%d",&n,&x);
	min=x<<1;
	int book[n];//存放每本书的价格
	for(int i=0;i<n;i++){
		scanf("%d",&book[i]);
		sum+=book[i];//记录包邮全部书的总金额
	}
	PostPrice(book,n,sum,0);
	printf("%d",min);
}
void PostPrice(int b[],int n,int s,int j)
{
	if(s<x)//如果总金额小于包邮金额则结束
		return ;
	if(s>=x&&s<min)
		min=s;
	for(int i=j;i<n;i++)
		PostPrice(b,n,s-b[i],i+1);//递归遍历全部组合情况,减法遍历
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值