分酒问题

import java.util.HashSet;
import java.util.Set;


class OilStatus {
	static int[] full = { 12, 8, 5 };
	int[] v = new int[3];
	OilStatus from; // 从哪个状态来

	public OilStatus(int a, int b, int c) {
		v[0] = a;
		v[1] = b;
		v[2] = c;
	}
	
	//操作方法
	public Set op() {
		Set rt = new HashSet();

		for (int i = 0; i < v.length; i++)
			for (int j = 0; j < v.length; j++) {
				if (i == j)
					continue;//不可能倒给自己
				if (v[i] == 0)
					continue;//自身是空的,不能倒
				if (v[j] == full[j])
					continue;//目标满了,也不能倒

				OilStatus t = new OilStatus(v[0], v[1], v[2]);
				t.from = this;

				t.v[j] += t.v[i];
				t.v[i] = 0;
				if (t.v[j] > full[j]) {
					t.v[i] = t.v[j] - full[j];
					t.v[j] = full[j];
				}

				rt.add(t);
			}

		return rt;
	}

	public String toString() {
		return "<" + v[0] + "," + v[1] + "," + v[2] + ">";
	}

	public int hashCode() {
		return 100;
	}

	public boolean equals(Object x) {
		OilStatus x2 = (OilStatus) x;
		return v[0] == x2.v[0] && v[1] == x2.v[1] && v[2] == x2.v[2];
	}

	public boolean has(int x) {
		return v[0] == x || v[1] == x || v[2] == x;
	}

	public OilStatus getFrom() {
		return from;
	}

}

public class Wine {
	public static void main(String[] args) {
		Set set = new HashSet(); // 存放所有状态
		set.add(new OilStatus(12, 0, 0));

		for (;;) {
			Set new_set = new HashSet();

			for (Object x : set) {
				OilStatus x2 = (OilStatus) x;//恢复身份
				Set t = x2.op();
				new_set.addAll(t);
			}

			if (set.containsAll(new_set))
				break;//如果新状态全都包在老状态里,便利结束

			set.addAll(new_set);//否则,加进去
		}

		// System.out.println(set);

		for (Object k : set) {
			OilStatus k2 = (OilStatus) k;
			if (k2.has(6)) {
				while (k2 != null) {
					System.out.println(k2);
					k2 = k2.getFrom();
				}
				break;
			}
		}

	}
}


<1,6,5>
<1,8,3>
<9,0,3>
<9,3,0>
<4,3,5>
<4,8,0>
<12,0,0>


泊松分酒问题是概率论中的一个经典问题,它描述的是在n杯大小相同的酒中随机分配k杯酒给m个人,每个人得到一杯的概率分布情况。这个问题可以用Python或C++来模拟,下面是一个简单的C++代码示例: ```cpp #include <iostream> #include <random> #include <vector> // 模拟泊松分布函数 int poisson_distribution(int k, double lambda, int n) { std::poisson_distribution<> dist(lambda); return dist(k) * (n choose k); // 使用组合数计算概率 } // 计算组合数 C(n, k) int combinations(int n, int k) { if (k == 0 || k == n) return 1; int numerator = 1, denominator = 1; for (int i = n; i > n - k; --i) { numerator *= i; denominator *= k; } return numerator / denominator; } int main() { int n = 10; // 酒杯总数 double lambda = 3.5; // 平均每杯酒被选中的概率(泊松参数) int m = 5; // 人数 for (int k = 0; k <= m; ++k) { int probability = poisson_distribution(k, lambda, n); std::cout << "Probability of getting exactly " << k << " cups when distributing among " << m << " people: " << probability << std::endl; } return 0; } ``` 在这个代码中,我们使用了C++的`<random>`库来生成泊松分布的结果,`<cmath>`库中的组合数计算方法。`poisson_distribution`函数模拟了随机分配k杯酒的概率,`combinations`函数计算了组合数。 如果你对这个代码有疑问或者想深入了解如何在C++中实现泊松分布,可以问: 1. 泊松分布在实际问题中有哪些应用? 2. 如何优化组合数计算,特别是当n和k都很大时? 3. 当m大于n时,泊松分酒问题会有怎样的特点?
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值