0

我正在创建一个让我们说“产品”的显示界面。对于此示例,假设显示器最多显示 4 个产品。产品可以来自多个来源。来源的数量永远不会大于要显示的产品数量(本示例最多 4 个来源)。每个来源包含 1 个或多个产品。目标是在各个来源中平均分配显示的产品数量。

4 个产品的逻辑将按如下方式处理。

  • 如果有1 个源,则将从该源中选择 4 个项目。 (4x1)
  • 如果有4 个来源,则将从每个来源中选择 1 个项目。(1x1+1x1+1x1+1x1)
  • 如果有2 个来源,则从每个来源中选择 2 个项目(2x1+2x1),除非一个来源只有 1 个产品,否则将遵循(1x1+3x1)
  • 如果有3 个源,则从 2 个源中选择 1 个项目,从 1 个源中选择 2 个项目(2x1+1x1+1x1)

在我开始循环输出产品之前,我有一个源集合和每个源中的项目数。

我的问题是:

循环每个来源并输出适当数量的产品的最简单方法是什么?

请记住,每个来源可能只有 1 个产品,因此可能无法选择 4 个产品。

4

2 回答 2

2

这是用于选择产品的简单 Python 代码。

它通过循环访问源并一次添加一个产品来工作。

这应该导致来源之间的公平分配。

如果您发现代码太慢,可以使代码效率更高。

Z=[1,10,10]       # Number of products available for each source
Y=len(Z)          # Number of sources
X=4               # number of products to output
B=[0]*Y           # Number of products to select for each source

a=0               # Next source to try and take a product from
while sum(B)<min(sum(Z),X):
    a=(a+1)%Y     # Change to a different source for the next product
    if B[a]<Z[a]: # Check that this source still has products left
        B[a]+=1   # Note that we have taken a product from source a

print B

在这个例子中,它打印

[1, 2, 1]

表示从第一个来源获取 1 个产品,从第二个来源获取 2 个产品,从第三个来源获取 1 个产品。

于 2012-11-27T20:01:19.650 回答
1

这是一个用 C# 编写的程序示例,它输出由 ID 标识的来源、每个来源中可用的产品数量和所选产品(每个来源都附加了来源 ID)作为证明:

using System.Linq;
using System.Collections.Generic;
using System;

namespace ConsoleApplication1
{
    class Product
    {
        public int Ordinal { get; set; }
        public Source Source { get; set; }
        public Product(int ordinal)
        {
            Ordinal = ordinal;
        }
    }
    class Source : List<Product>
    {
        public int Id { get { return this.GetHashCode(); } }
        public int AvailableProducts { get { return this.Count; } }
        public Source(int availableProducts)
        {
            for (int i = 0; i < availableProducts; i++)
            {
                var p = new Product(i);
                p.Source = this;
                this.Add(p);
            }
        }
    }

    class Sources : List<Source>
    {
    }


    class Program
    {
        static void Main(string[] args)
        {
            var sources = new Sources();
            var productsToBeSelected = 4;
            var sourceNumber = Math.Min(productsToBeSelected, 4);
            var maxProductsPerSource = 5;

            for (int i = 0; i < sourceNumber; i++)
            {
                var source = new Source((new Random(i + Int32.Parse(DateTime.Now.Ticks.ToString().Substring(DateTime.Now.Ticks.ToString().Length - 6)))).Next(maxProductsPerSource));
                sources.Add(source);
            }

            var candidateProducts=new List<Product>();
            sources.ForEach(i=>i.ForEach(p=>candidateProducts.Add(p)));

            var selectedProducts = candidateProducts.OrderBy(i => i.Ordinal).Take(productsToBeSelected);

            foreach (var item in sources)
            {
                Console.WriteLine("Source ID: {0}, {1} products",item.Id, item.Count);
            }

            foreach (var item in selectedProducts)
            {
                Console.WriteLine("Product ordinal: {0} from source {1}", item.Ordinal , item.Source.Id);
            }
        }
    }
}
于 2012-11-27T21:06:58.020 回答