2011-0021

从 Trac 迁移的文章

这是从旧校内 Wiki 迁移的文章,可能存在一些样式问题,您可以向 memset0 反馈。

原文章内容如下:

occupied by wizard
此题是个01背包的dp模型 但价格是小数 需要先乘一个常数扩大规模 然后把结果再除以这个常数即可 注意精度的处理

my source code:
#include<cstdio>
#include<cstring>
#include<cmath>
using namespace std;
const double esp=0.000001;
int main()
{
    int n,a,b;
    double m;
    bool g[100000];
    double tcost;
    double aa[100];
    while(scanf("%d%d%d%lf",&n,&a,&b,&m)==4){
        double sum=0;
        for(int i=0;i<n;i++){
            scanf("%lf",&aa[i]);
            sum+=aa[i];
        }
        memset(g,0,sizeof(g));
        g[0]=1;
        for(int i=0;i<n;i++)
            for(int j=0;j<(int)(sum*10);j++){
                double s=(double)j/10.0;
                int t=int((s-aa[i])*10);
                g[j]=g[t] || g[j];
            }
        double min=sum*10;
        for(int i=0;i<(int)(sum*10);i++){
            if(g[i]){
                double cost=(double)i/10.0;
                int pb=(int)cost/a*b;
                if(pb<=sum-cost){
                    tcost=sum-pb;
                }
                else tcost=cost;
            }
            if(tcost<min) min=tcost;
        }
        if(fabs(min-m)<esp) printf("Bonus %.2lf\n",m);
        else printf("Penalty %.2lf\n",m-min);
    }
    return 0;
}

occupied by wizard

此题是个01背包的dp模型 但价格是小数 需要先乘一个常数扩大规模 然后把结果再除以这个常数即可 注意精度的处理

my source code:

#include

#include

#include

using namespace std;

const double esp=0.000001;

int main()

{

int n,a,b;

double m;

bool g[100000];

double tcost;

double aa[100];

while(scanf("%d%d%d%lf",&n,&a,&b,&m)==4){

double sum=0;

for(int i=0;i

scanf("%lf",&aa[i]);

sum+=aa[i];

}

memset(g,0,sizeof(g));

g[0]=1;

for(int i=0;i

for(int j=0;j<(int)(sum*10);j++){

double s=(double)j/10.0;

int t=int((s-aa[i])*10);

g[j]=g[t] || g[j];

}

double min=sum*10;

for(int i=0;i<(int)(sum*10);i++){

if(g[i]){

double cost=(double)i/10.0;

int pb=(int)cost/a*b;

if(pb<=sum-cost){

tcost=sum-pb;

}

else tcost=cost;

}

if(tcost

}

if(fabs(min-m)

else printf("Penalty %.2lf\n",m-min);

}

return 0;

}