2017校招-数字游戏

2017校招-数字游戏
小易邀请你玩一个数字游戏,小易给你一系列的整数。你们俩使用这些整数玩游戏。每次小易会任意说一个数字出来,然后你需要从这一系列数字中选取一部分出来让它们的和等于小易所说的数字。 例如: 如果{2,1,2,7}是你有的一系列数,小易说的数字是11.你可以得到方案2+2+7 = 11.如果顽皮的小易想坑你,他说的数字是6,那么你没有办法拼凑出和为6 现在小易给你n个数,让你找出无法从n个数中选取部分求和的数字中的最小数(从1开始)。

输入描述:
输入第一行为数字个数n (n ≤ 20)
第二行为n个数xi (1 ≤ xi ≤ 100000)

输出描述:
输出最小不能由n个数选取求和组成的数

示例1
输入
3
5 1 2
输出
4

动态规划
解题思路:先排序,假如排序后的前i个数能构造的最大的数为k,则对于排序号第i+1个数,若data[i+1]<=k+1,则我可以得到的最大的数为data[i+1]+k,若data[i+1]>k+1,则会出现空挡,k+1就肯定不能再得到。

#include<iostream>
#include<algorithm>
using namespace std;
int main()
{
 int n;
 cin >> n;
 int data[n];
 for(int i = 0;i < n;i++)cin >> data[i];
 sort(data,data+n);
 int res = 0;
 for(int i = 0;i < n;i++)
 {
  if(data[i] > res+1)
  {
   cout << res+1;
   return 0;
  }
  res += data[i];
 }
 cout << res + 1;
}

暴力求解法

#include<iostream>
#include<algorithm>
using namespace std;
int main()
{
 int n;
 cin >> n;
 int data[n];
 for(int i = 0;i < n;i++)cin >> data[i];
 bool flag[2000005]={false};
 int shangxian = 1 << n;
 for(int i = 1;i < shangxian;i++)
 {
  int sum = 0;
  for(int j = 0;j < n;j++)
  {
   if((1<<j)&i)sum+=data[j];
  }
  flag[sum] = true;
 }
 for(int i = 1;;i++)
 {
  if(flag[i] == false)
  {
   cout << i;
   return 0;
  }
 } 
}

猜你喜欢

转载自blog.csdn.net/weixin_40936298/article/details/82927920