天上掉 Pizza

实在不知道错哪了。。。

对着 std 检查了好几遍了QAQ

题解见注释(不过估计题解也是错的,不然为什么写错啊QAQ

#include<bits/stdc++.h>
using namespace std;
const int N=1<<16;
int m,n,a,b;
double pr[N],s[N],av[N],g[16][16],x[16],y[16];
//pr价值和 s面积和 av平均值 g优惠值 x单个价格 y单个面积
int main()
{
	while(scanf("%d",&m))
	{
		if(m==0) break;
		for(int i=1;i<=m;i++)
		{
			for(int j=1;j<=m;j++) g[i][j]=1;
			scanf("%lf%lf%d",&x[i],&y[i],&n);
			for(int i=1;i<=n;i++)
			{
				scanf("%d%d",&a,&b);
				g[i][a]*=1-b/100;
			}
		}
		for(int i=0;i<=(1<<m)-1;i++) {av[i]=1e7;pr[i]=0;s[i]=0;}
		for(int i=0;i<=(1<<m)-1;i++)//枚举当前状态 
		{
			for(int j=1;j<=m;j++)
			{
				if(i&(1<<(j-1))) continue;//如果j已被取过 
				double a=x[j],b=y[j];
				for(int k=1;k<=m;k++)//计算优惠 
				{
					int w=1<<(k-1);
					if(i&w) a*=g[k][j]; //如果买了第i个披萨就有优惠
				}
				double c=pr[i]+a,d=s[i]+b;//c为体积,d为面积 
				if(c/d<av[i|(1<<(j-1))])//如果平均价格小于当前最小价格就更新答案 
				{//i|(1<<(j-1))表示当前状态 
					av[i|(1<<(j-1))]=c/d;
					pr[i|(1<<(j-1))]=c;s[i|(1<<(j-1))]=d;
				}
			}
		}
		double minn=1e7;
		for(int i=1;i<=(1<<m)-1;i++) minn=min(minn,av[i]);
		printf("%.4lf
",minn);
	}
	return 0;
}
原文地址:https://www.cnblogs.com/ying-xue/p/tian-shang-diao-pizza.html