问题描述:

某财务部门结账时发现总金额不对头。很可能是从明细上漏掉了某1笔或几笔。如果已知明细账目清单,能通过编程找到漏掉的是哪1笔或几笔吗?
如果有多种可能,则输出所有可能的情况。

我们规定:用户输入的第一行是:有错的总金额。

接下来是一个整数n,表示下面将要输入的明细账目的条数。

再接下来是n行整数,分别表示每笔账目的金额。

要求程序输出:所有可能漏掉的金额组合。每个情况1行。金额按照从小到大排列,中间用空格分开。

比如:
用户输入:

6

5

3

2

4

3

1

表明:有错的总金额是6;明细共有5笔。

此时,程序应该输出:

1 3 3

1 2 4

3 4
为了方便,不妨假设所有的金额都是整数;每笔金额不超过1000,金额的明细条数不超过100。

代码实现:
#include "stdio.h"
int n;//集合S中元素的个数
int c;//子集和的目标值
int cw;//当前子集和
int bestw;//当前的最优值
int w[100];
int x[100];//构成当前子集和的元素
int r; //集合S中剩余的所有的元素的和
int b[100][100],bb[100],a[100];
int p=0,k=0;
void f(int t)
{
if(t>n)
{
if(cw==c)
{
for(int i=1;i<=n;i++)
if(x[i])
{b[p][k++]=w[i];}
bb[p]=k;
p++;
k=0;
}
return ;
}
//更新剩余的所有元素的和
r-=w[t];
if(cw+w[t]<=c)//搜索左子树
{
x[t]=1;
cw+=w[t];
f(t+1);
cw-=w[t];
}
if(cw+r>bestw)//搜索又子树
{
x[t]=0;
f(t+1);
}
r+=w[t];//恢复状态
}
int main()
{
int m,i,j,tt,ii,jj;
r=0;cw=0;
scanf("%d",&m);
scanf("%d",&n);
for(i=1;i<=n;i++)
{
scanf("%d",&w[i]);
r=r+w[i];
}
c=r-m;
for(i=1;i<n;i++)
for(j=i+1;j<=n;j++)
{
if(w[i]>w[j])
{
tt=w[i];w[i]=w[j];w[j]=tt;
}
}
f(1);
for(i=0;i<p;i++)
{
for(j=0;j<bb[i]-1;j++)
{
a[i]=b[i][j]*b[i][j+1];
}
}
for(ii=0;ii<p-1;ii++)
{
for(jj=ii+1;jj<p;jj++)
{
if(a[ii]==a[jj])
a[jj]=0;
}
}
for(i=0;i<p;i++)
{
if(a[i]==0) continue;
for(j=0;j<bb[i];j++)
{
printf("%d ",b[i][j]);
}
printf("\n");
}
return 0;
}

漏掉的账目(用C语言去重)的更多相关文章

  1. java实现漏掉的账目明细

    某财务部门结账时发现总金额不对头.很可能是从明细上漏掉了某1笔或几笔.如果已知明细账目清单,能通过编程找到漏掉的是哪1笔或几笔吗? 如果有多种可能,则输出所有可能的情况. 我们规定:用户输入的第一行是 ...

  2. go语言的排序和去重

    go语言的排序: https://blog.csdn.net/u010983881/article/details/52460998 go语言去重: https://blog.csdn.net/qq_ ...

  3. 1.2 Why Python for Data Analysis(为什么使用Python做数据分析)

    1.2 Why Python for Data Analysis?(为什么使用Python做数据分析) 这节我就不进行过多介绍了,Python近几年的发展势头是有目共睹的,尤其是在科学计算,数据处理, ...

  4. 算法笔记_126:算法集训之编程大题集二(Java)

     目录 1 连续数的公倍数 2 漏掉的账目明细 3 罗马数字转十进制 4 逻辑推断 5 平面4点最小距离 6 取球博弈 7 人民币金额大写 8 人员排日程 9 三角螺旋阵 10 手机尾号评分   1 ...

  5. R语言数据去重

    R语言常用的去重命令有unique duplicated unique主要是返回一个把重复元素或行给删除的向量.数据框或数组 > x <- c(3:5, 11:8, 8 + 0:5)> ...

  6. C语言字符串/数组去重

    输入: hello 输出: helo 第一种实现: 不新开数组, 也就是原地去重. #include <stdio.h> #include <string.h> void re ...

  7. C#NPOI.RabbitMQ.EF.Attribute.HttpRuntime.Cache.AD域.List<T>根据指定字段去重.前端JQuery.Cache.I18N(多语言).data-xx(自定义属性)

    使用NPOI 操作Excel 个人使用的电脑基本默认安装Excel 操作起来 调用Excel的组件便可.如果是一台服务器.没有安装Excel,也就无法调用Excel组件. 在此推荐第三方插件.NPOI ...

  8. C语言对字符串去重

    # include <stdio.h> # include <string.h> char * getNewChar(char * str,char * newStr); in ...

  9. C语言 · 数组排序去重

    算法训练 数组排序去重   时间限制:1.0s   内存限制:512.0MB        问题描述 输入10个整数组成的序列,要求对其进行升序排序,并去掉重复元素. 输入格式 10个整数. 输出格式 ...

随机推荐

  1. Http网络请求

    前提说明: 1.Str.Empty 其实就是 string.Empty 2.@object.IsNull() 的IsNull() 是判断“是否等于null”的扩展方法,等同于  @object==nu ...

  2. Google机器学习教程心得(三) 好的feature

    什么造就好的Feature Google Machine Learning Recipes 3 官方中文博客 http://chinagdg.org/2016/03/machine-learning- ...

  3. SQL Server 改变数据库的名字

    方法 1: alter database modiry name = new_database_name; ---------------------------------------------- ...

  4. Linux07--Shell程序设计03 通配符与正则表达式

    通配符 通配符可用于代替字符. 通常地,星号“*”匹配0个或以上的字符,问号“?”匹配1个字符. 使用情况: 1.文件和目录 在CP/M.DOS.Microsoft Windows和类Unix操作系统 ...

  5. Android01-概述

    1.Android特点    开源和免费    强大的研发力量,完整的生态圈    互联网服务的支持 2.Android系统架构    应用层    应用框架层    系统运行库层    Linux内 ...

  6. Log4J使用笔记(转)

    转自:http://www.cnblogs.com/eflylab/archive/2007/01/11/618001.html Log4J是Apache的一个开放源代码的项目.通过使用Log4J,程 ...

  7. umdh工具使用

    先安装工具,http://msdn.microsoft.com/en-us/windows/hardware/gg463009.aspx 选择其中的http://msdn.microsoft.com/ ...

  8. java中读取程序运行时间

    第一种是以毫秒为单位计算的. Java代码 //伪代码 long startTime=System.currentTimeMillis();   //获取开始时间 doSomeThing();  // ...

  9. mysql数据库学习(一)--基础

    一.简介 MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,目前属于 Oracle 旗下产品.MySQL 最流行的关系型数据库管理系统,在 WEB 应用方面MySQL是最好的 R ...

  10. e = e || window.event用法细节讨论

    e = e || window.event是我们在做事件处理时候区分IE和其他浏览器事件对象时常用的写法.但是这行兼容性代码有没有必要出现在所有的事件句柄中呢?标准事件调用方式需要这行代码吗?下边我们 ...