天上掉 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\n",minn);
}
return 0;
}
upd on 2022.10.17:今天修博客发现这篇,为啥会把错误代码放在这里来着() 不过我没有原题,当时错在哪就无从得知了/wq
本文来自博客园,作者:樱雪喵,转载请注明原文链接:https://www.cnblogs.com/ying-xue/p/tian-shang-diao-pizza.html