题目描述
某财务部门结账时发现总金额不对头。很可能是从明细上漏掉了某 1 笔或几笔。如果已知明细账目清单,能通过编程找到漏掉的是哪 1 笔或几笔吗?
如果有多种可能,则输出所有可能的情况。
输入描述
用户输入的第一行是:有错的总金额。
接下来是一个整数 nn,表示下面将要输入的明细账目的条数。
再接下来是 nn 行整数,分别表示每笔账目的金额。
为了方便,不妨假设所有的金额都是整数;每笔金额不超过 1000,金额的明细条数不超过 100。
输出描述
所有可能漏掉的金额组合。每个情况 1 行。金额按照从小到大排列,中间用空格分开。
样例">输入输出样例
示例
输入
6
5
3
2
4
3
1
输出
1 2 4
1 3 3
3 4
代码如下
#include <bits/stdc++.h>
using namespace std;
int total[1001] = {0};
int lastnum[1001];
void dfs(int mny, int bm, int num);
void dfs(int mny, int bm, int num)
{
if (mny == 0)
{
for (size_t i = 0; i < num; i++)
{
cout << lastnum[i] << " ";
}
cout << endl;
return;
}
for (size_t i = bm; i <= mny; i++)
{
if (total[i] > 0)
{
total[i]--;
lastnum[num] = i;
dfs(mny - i, i, num+1);
total[i]++;
}
}
}
int main()
{
int money, x;
cin >> money >> x;
int temp;
for (size_t i = 0; i < x; i++)
{
cin>>temp;
total[temp]++;
money-=temp;
}
dfs(-money,0,0);
return 0;
}