online_judge_1025

来源:互联网 发布:2016最新癌症数据统计 编辑:程序博客网 时间:2024/06/05 19:07

做这道题目又是一次血泪史,做了一个多小时。其实动态规划解决背包问题算法很快就写出来了。但是……始终在处理输入问题的时候出了细节问题。之前处理输入我是直接把不符合要求就直接break,这样就导致输入会出现问题。但是题目给的三个例子正好没有涉及到这个。导致我悲剧的一个多小时。最后还是看别人AC的代码才发现我的问题所在

#include <iostream>#include <string>#include <algorithm>#include <iomanip>#include <cstdio>using namespace std;double c[31];int ci[31];int dp[3000001];char ch;bool flag;double price;int sum;void Pro(int t, int i){    flag = false;    while(t--)    {        scanf(" %c:%lf",&ch,&price);        if(!(ch=='A' || ch=='B' || ch=='C'))        {            c[i] = -1;            flag = 1;        }        if((ch=='A' || ch=='B' || ch=='C') && (!flag))        {            if(price <= 600)                c[i] += price;            else            {                flag = 1;                c[i] = -1;                flag = true;            }        }    }    if(c[i] > 1000 || flag)        c[i] = -1;}int main(){    double Q;    int N;    int i,j,t;    double result;    while(cin>>Q>>N)    {        if(N == 0)            break;        if(Q>30000)            Q = 30000;        sum = Q*100;        for(i=0; i<N; ++i)        {            cin>>t;            c[i] = 0;            Pro(t, i);        }        for(i=0; i<=sum; ++i)        {            dp[i] = 0;        }        j = 0;        for(i=0; i<N; ++i)        {            if(c[i] != -1)                ci[j++] = 100*c[i];        }        N = j;        for(i=0; i<N; ++i)        {            for(j=sum; j>= ci[i]; --j)            {                if(dp[j] < dp[j-ci[i]] + ci[i])                {                    dp[j] = dp[j-ci[i]] + ci[i];                }            }        }        result = ((double)dp[sum])/100.0;        cout<<fixed<<setprecision(2)<<result<<endl;    }    return 0;}

反思:也许应该静下心来思考思考.太浮躁往往导致低效……


0 0
原创粉丝点击