ALGO-115_蓝桥杯_算法训练_和为T(枚举)

问题描述
  从一个大小为n的整数集中选取一些元素,使得它们的和等于给定的值T。每个元素限选一次,不能一个都不选。
输入格式
  第一行一个正整数n,表示整数集内元素的个数。
  第二行n个整数,用空格隔开。
  第三行一个整数T,表示要达到的和。
输出格式
  输出有若干行,每行输出一组解,即所选取的数字,按照输入中的顺序排列。
  若有多组解,优先输出不包含第n个整数的;若都包含或都不包含,优先输出不包含第n-1个整数的,依次类推。
  最后一行输出总方案数。
样例输入 - - - 样例输出
- -
- - 数据规模和约定
  <=n<=
  T<=maxlongint
  集合中任意元素的和都不超过long的范围

记:

一开始写的代码量大,很不便于理解

于是上网搜寻,参考了一篇使用二进制枚举输出的方法,代码少且易读,学习了

(代码参考:https://blog.csdn.net/murphypu/article/details/69053861)

关于枚举子集的方法(包含二进制枚举):https://www.cnblogs.com/itlqs/p/5720784.html

解题思路:

题目要求:"若有多组解,优先输出不包含第n个整数的;若都包含或都不包含,优先输出不包含第n-1个整数的,依次类推。"

该输出要求可以通过二进制枚举输出实现

二进制枚举,以题目输入为例

ALGO-115_蓝桥杯_算法训练_和为T(枚举)

枚举输出(代表数组下标)与题意符合,故采用

AC代码:

 #include <stdio.h>

 int main(void)
{
int i,j;
int n;
long long t,sum;
long long arr[+];
int count = ; scanf("%d",&n);
for (i = ; i < n ; i ++)
{
scanf("%lld",&arr[i]);
}
scanf("%lld",&t); for (i = ; i < (<<n) ; i ++)
{
sum = ;
for (j = ; j < n ; j ++)
{
/*找数对应的二进制,其中二进制中为1的即是数组中要选择的数*/
if (i&(<<j))
{
sum += arr[j];
}
} if (sum == t)
{
for (j = ; j < n ; j ++)
{
if (i&(<<j))
printf("%lld ",arr[j]);
}
printf("\n");
count ++;
}
}
printf("%d",count);
return ;
}
上一篇:关于 webapi ajax进度条信息设置


下一篇:mysql select 练习题