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