题目
①:先判断n张发票中,有哪些是可以是报销的,可以报销的条件是( 同类不能超过600,每张发票不能超过1000,除了A,B,C之外类型的发票不能报销 ),并且计算出每张发票可以报销的总额。
②:初始化dp[0] = 0,表示都没有报销,外层循环遍历后续的发票,内层循环遍历当前发票之前的发票,判定如果报销发票满足输入能报销的最大额,就加上。
③:最后遍历一边dp数组,找出最大值就是解。
#include<stdio.h>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
const int maxn = 35;
int main()
{
int i,j,num;
char str,b;
double w,A,B,C,data;
double dp[maxn],m[maxn];
int n;
while(cin>>w>>n && n)
{
memset(dp,0,sizeof(dp));
int cnt = 1;
for(i=0; i<n; i++)
{
A = 0,B = 0,C = 0;
cin >> num;
int flag = 0;
for(j=0; j<num; j++)
{
cin>>str>>b>>data;
if(str == 'A')
A+=data;
else if(str == 'B')
B+=data;
else if(str == 'C')
C+=data;
else
flag =1;
}
if(!flag && A<=600 && B<=600 && C<=600 && A+B+C <=1000 )
{
m[cnt++] = A+B+C;
}
}
for(i=1; i<cnt; i++)
{
for(j=i-1; j>=0; j--)
{
if(dp[j] + m[i] <= w)
dp[i] = max(dp[i], dp[j]+m[i]);
}
}
double Max = 0;
for(i=1; i<cnt; i++)
{
if(dp[i] > Max)
Max = dp[i];
}
printf("%.2lf
",Max);
}
return 0;
}
刚开始拿到这道题,觉得信息有点多,理了半天都理不清楚。要把一团乱麻理顺还真不容易。。。。