问个算法问题

SharkShen 2020-06-08 03:56:55
double[] strArr = new double[] { 328154.50,499633.33,886138.37,1066258.84, 194515.20,16159.67,16159.66,198236.16,
1127236.45,362708.61,135907.91,1129509.10,551282.22,20071.67,};
double NUM = 2754440.06;

一个比较好的公司财务问我一个问题,有14张发票寄给对方,对方拒收了几张,只给了一个拒收金额,问我能不能算出来是哪几个金额的发票,不清楚是几张拒收,问下大家有没有思绪。
...全文
165 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
ZSZhen 2020-06-09
  • 打赏
  • 举报
回复
引用 4 楼 mqmmx 的回复:
应该是数据精度问题, 改类型double为decimal就能得到结果了 362708.61 1127236.45 198236.16 1066258.84
大佬厉害,我经验还是太少了,改了一下代码果然可以
        private void button1_Click(object sender, EventArgs e)
        {
            List<double> strArr = new List<double> { 328154.50,499633.33,886138.37,1066258.84, 194515.20,16159.67,16159.66,198236.16,
                                     1127236.45,362708.61,135907.91,1129509.10,551282.22,20071.67 };
            double NUM = 2754440.06;

            for (int i = 0; i < strArr.Count; i++)
            {
                strArr[i] = strArr[i] * 100;     
            }
            NUM = NUM * 100;
            List<double> result = GetNum(strArr, NUM);
            for (int i = 0; i < result.Count; i++)
            {
                result[i] = Math.Round(result[i] / 100, 2);
            }
        }
mqmmx 2020-06-09
  • 打赏
  • 举报
回复
应该是数据精度问题, 改类型double为decimal就能得到结果了 362708.61 1127236.45 198236.16 1066258.84
qijialin 2020-06-09
  • 打赏
  • 举报
回复
是的只能硬算,只是看谁的代码更优!没必要贴代码吧!
ZSZhen 2020-06-09
  • 打赏
  • 举报
回复
        private void button1_Click(object sender, EventArgs e)
        {
            List<double> strArr = new List<double> { 328154.50,499633.33,886138.37,1066258.84, 194515.20,16159.67,16159.66,198236.16,
                                     1127236.45,362708.61,135907.91,1129509.10,551282.22,20071.67 };
            double NUM = 2754440.06;

            //你给的数据结果为0,数据应该不准确,下面是测试数据
            List<double> strArr1 = new List<double> { 1.5, 2.6, 3.7, 4, 9 };
            double num1 = 13;
            List<double> result = GetNum(strArr1, num1);
        }

        private List<double> GetNum(List<double> numlist, double num)
        {
            List<double> dblist = new List<double>();
            for (int i = 0; i < numlist.Count; i++)
            {
                if (numlist[i] == num)
                {
                    dblist.Add(numlist[i]);
                    return dblist;
                }
                else if (numlist[i] > num)
                {
                    continue;
                }
                else if (numlist[i] < num)
                {
                    List<double> newlist = new List<double>();
                    for (int j = i+1; j < numlist.Count; j++)
                    {
                        newlist.Add(numlist[j]);
                    }
                    dblist = GetNum(newlist, num - numlist[i]);
                    if (dblist.Count > 0)
                    {
                        dblist.Add(numlist[i]);
                        return dblist;
                    }
                    else
                    {
                        continue;
                    }
                }
            }
            return dblist;
        }
测试结果
wanghui0380 2020-06-08
  • 打赏
  • 举报
回复
贪婪回溯 别问我怎么写,看这个帖子,左边和下面的推荐贴。这种帖子其实不要求回答,只看思路。NP,P都是没有好解的。都属于硬算类型。 无论是贪婪回溯,模拟退火,动态规划-------都是探测型算法,没啥可说的,就是让计算机硬算,不对就重新再来

110,569

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧