首页 > 代码库 > 01背包水题篇之HDU1864——最大报销额
01背包水题篇之HDU1864——最大报销额
这个题目好果的01,只要把每个数乘以100,就能解决下标的问题了
继续贴代码环节(自己的代码好丑啊~~~)
<span style="font-size:18px;">#include<iostream> #include<algorithm> #include<cstring> #include<cstdio> #define maxn 3100000 using namespace std; int dp[maxn]; int p[31]; int main() { double Q; int n,V; while(~scanf("%lf%d",&Q,&n)&&n){ int k=0; V=Q*100; while(n--){ int m,flag=1; double ts=0,a; char s[10]; cin>>m; double va,vb,vc; va=vb=vc=0; while(m--){ cin>>s; if(s[0]!='A'&&s[0]!='B'&&s[0]!='C'){ flag=0; } else{ sscanf(s,"%*[A-Z]:%lf",&a);//我用了下sscanf函数,可以这样输入scanf("%c:%lf",&ch,&a); if(s[0]=='A'){ va+=a; if(va>600) flag=0; } if(s[0]=='B'){ vb+=a; if(vb>600) flag=0; } if(s[0]=='C'){ vc+=a; if(vc>600) flag=0; } } } if(va+vb+vc>1000) flag=0; if(flag) p[k++]=(va+vb+vc)*100; } memset(dp,0,sizeof dp); for(int i=0;i<k;i++){ for(int j=V;j>=p[i];j--){ dp[j]=max(dp[j],dp[j-p[i]]+p[i]);//照搬01的方程 } } printf("%.2lf\n",1.0*dp[V]/100);//输出转化为double型 } return 0; }</span>
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。