hdu-1864 最大报销额

简单的背包题 ;好无奈,我又没做出来在考试的时候
代码:
#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
double dp[60],money[60];
double total;
int num,i,j,n,k,t;
double max(double a,double b){
	return a>b?a:b;
}
int main(){
	int flag,temp;
	char ch;
	double A,B,C,m;
	while(~scanf("%lf %d",&total,&num),num){
		temp=0;
		memset(dp,0,sizeof(dp));
		memset(money,0,sizeof(money));
		for(i=1;i<=num;i++){
			A=0; B=0; C=0;
			flag=1;
			scanf("%d",&n);
			for(j=0;j<n;j++){
				scanf(" %c:%lf",&ch,&m);
			//	printf("%c:%.2lf\n",ch,m);
				if(ch!='A'&&ch!='B'&&ch!='C'||m>600)
				{
					flag=0;
					break;
				}
				if(ch=='A')				 
				   A+=m;
				else if(ch=='B')
				   B+=m;
				else if(ch=='C')				
				   C+=m;
			}
			if(flag && A<=600 && B<=600 && C<=600 && A+B+C<=1000)			
			   money[temp++]=A+B+C;
		//	   printf("%.2lf ",A+B+C)
	
		//	printf("%.2lf ",money[temp-1]);
		}
		for(i=0;i<=temp;i++){
			for(j=temp;j>=1;j--){
				if(j==1 || dp[j-1]>0 && dp[j-1]+money[i]<=total)
				   dp[j]=max(dp[j],dp[j-1]+money[i]);
			}
	
		}
		int sum=0;
		for(i=1;i<=temp;i++)
		   if(dp[sum]<dp[i])
		      sum=i;
	    printf("%.2lf\n",dp[sum]);
	}
	return 0;
} 

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1864
posted @   wojiaohuangyu  阅读(4)  评论(0编辑  收藏  举报
编辑推荐:
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
阅读排行:
· 终于写完轮子一部分:tcp代理 了,记录一下
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
点击右上角即可分享
微信分享提示