本人是一名小白,在此分享一下自己的见解,如有问题还请不吝指正。
首先,题目已经提示了用直接枚举,因此我一开始用循环尝试骗分,结果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);//递归遍历全部组合情况,减法遍历 }