使用PQ解决2个分拆费用的问题

示例文件下载:

链接:百度网盘
提取码:1234

问题一

问题

现有一份费用明细表的示例,和一份带有入职日期、离职日期的花名册,要求将费用按该月各部门的人数为依据进行分摊,分摊后每个部门为一行,做成最右侧的表格。
image.png|600

将花名册转化为各月各部门的人数
创建一个含各月的表
为每个月计算出该月的名单

只要入职日期在月末之前,离职日期在月初之后的,都计入该部门当月的人数。

展开部门列,并透视,得到结果
合并费用表 与 各月各部门在职人数表,并完成分摊计算

加载数据,便得到结果
image.png

问题二:

问题

与问题一类似,也是分拆费用,只是分拆依据不再是花名册,而是根据费用的明细名单,人工统计的各部门分到的人数。
需要实现这样一个模板,在每行费用的各部门下填入分配依据,它自动完成分配。

image.png|600

比如,我查看费用的名单后,发现第一行的费用数据全为销售部的,第三行生产部7人,销售部3人。则只要如下图填写表格,表格可以自动完成费用分拆。

image.png|600

假设我们要按下图所示的分配依据进行分拆

image.png|600

操作步骤演示

得到结果

image.png|400

总结

用PQ解决这两个问题,我们可以看到这里面并没有什么复杂的操作与代码。也不会留下许多辅助表、辅助列。而且,我们并没有使用过任何一次的复制粘贴。所以数据流始终是完全连贯的,无论是替换数据还是补充数据,我们只要刷新一下,就又得到了想要的结果 。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,我可以为您解答这个问题。 首先,让我们简单介绍一下什么是优先队列和01背包问题。 优先队列是一种数据结构,它可以维护一组元素,并按照一定的优先级对它们进行排序。在优先队列中,每个元素都有一个与之关联的优先级,队列会按照优先级从高到低对元素进行排序。 01背包问题是指在给定的一组物品中,选择一些物品放进容量为V的背包中,使得放进背包中的物品总价值最大。其中,每个物品只有一个,可以选择放或不放。 那么,如何使用优先队列解决01背包问题呢?我们可以使用贪心算法,每次从优先队列中取出价值最高的物品放入背包中,直到背包装满或优先队列为空。 下面是使用C语言实现的代码: ```c #include <stdio.h> #include <stdlib.h> #define MAX_N 100 // 物品的最大数量 #define MAX_V 10000 // 背包的最大容量 typedef struct { int v; // 物品的体积 int w; // 物品的价值 } item; // 用于比较两个item的优先级 int cmp(const void* a, const void* b) { item* x = *(item**)a; item* y = *(item**)b; double ratio_x = (double)x->w / x->v; double ratio_y = (double)y->w / y->v; if (ratio_x > ratio_y) { return -1; } else if (ratio_x < ratio_y) { return 1; } else { return 0; } } // 使用优先队列解决01背包问题 int knapsack(item* items[], int n, int capacity) { int i; int used = 0; int value = 0; // 定义一个优先队列 item** pq = malloc(n * sizeof(item*)); // 将物品按照单位价值从高到低排序 for (i = 0; i < n; i++) { pq[i] = items[i]; } qsort(pq, n, sizeof(item*), cmp); // 依次将优先队列中的物品放入背包中 for (i = 0; i < n; i++) { if (used + pq[i]->v <= capacity) { used += pq[i]->v; value += pq[i]->w; } else { break; } } free(pq); return value; } int main() { int n, capacity; item items[MAX_N]; int i; // 读入物品的数量和背包的容量 scanf("%d %d", &n, &capacity); // 读入每个物品的体积和价值 for (i = 0; i < n; i++) { scanf("%d %d", &items[i].v, &items[i].w); } // 使用优先队列解决01背包问题 int max_value = knapsack(items, n, capacity); // 输出结果 printf("%d\n", max_value); return 0; } ``` 以上就是使用C语言实现的优先队列解决01背包问题的代码。希望能帮到您!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值