普通01背包,按要求去掉不同的发票就行了。double取后两位强制转化成int。
用dfs也实现了一下,数据弱,比dp还快。。。
1:支票出现A,B,C类之外的类型 作废
2:单张总额超过1000或者最大额度,作废
3:单类别超过600,作废,如A:300 A:400,只要类别一样就一起算,作废
#include<stdio.h>
#include<iostream>
#include<string.h>
#include<vector>
#include<algorithm>
using namespace std;
vector<double>v;
double ans;
void solve();
int n;
double m;
int s[3000050];
int main(){
scanf("%lf%d",&m,&n);
while(n){
double count = 0;
v.clear();
for(int i=0;i<n;i++){
int t;
scanf("%d",&t);
int s = 0;
double sum = 0;
double a = 0,b = 0,c = 0;
for(int j=0;j<t;j++){
char c;
double q;
scanf(" %c:%lf",&c,&q);
if(!s&&c=='A'&&q + a<=600){
a+=q;
sum += q;
}
else if(!s&&c=='B'&&q + b<=600){
b+=q;
sum += q;
}
else if(!s&&c=='C'&&q + c<=600){
c+=q;
sum += q;
}
else{
s = 1;
}
}
if(!s&&sum<=1000&&sum<=m&&a<=600&&b<=600&&c<=600){
count += sum;
v.push_back(sum);
}
}
if(count<=m){
printf("%.2lf\n",count);
}
else{
ans = -1;
solve();
printf("%.2lf\n",(ans)/100);
}
scanf("%lf%d",&m,&n);
}
return 0;
}
void solve(){
memset(s,0,sizeof(s));
for(int i=0;i<v.size();i++){
for(int j=int(m*100);j>=int(v[i]*100);j--){
s[j] = max(s[j],s[j-int(v[i]*100)]+int(v[i]*100));
}
}
ans = (double)s[int(m*100)];
}
#include<stdio.h>
#include<iostream>
#include<string.h>
#include<vector>
#include<algorithm>
using namespace std;
vector<double>v;
double ans;
void dfs(double t,int d);
int n;
double m;
int main(){
scanf("%lf%d",&m,&n);
while(n){
double count = 0;
v.clear();
for(int i=0;i<n;i++){
int t;
scanf("%d",&t);
int s = 0;
double sum = 0;
double a = 0,b = 0,c = 0;
for(int j=0;j<t;j++){
char c;
double q;
scanf(" %c:%lf",&c,&q);
if(!s&&c=='A'&&q + a<=600){
a+=q;
sum += q;
}
else if(!s&&c=='B'&&q + b<=600){
b+=q;
sum += q;
}
else if(!s&&c=='C'&&q + c<=600){
c+=q;
sum += q;
}
else{
s = 1;
}
}
if(!s&&sum<=1000&&sum<=m){
count += sum;
v.push_back(sum);
}
}
if(count<=m){
printf("%.2lf\n",count);
}
else{
ans = -1;
sort(v.begin(),v.end());
dfs(0,0);
printf("%.2lf\n",ans);
}
scanf("%lf%d",&m,&n);
}
return 0;
}
void dfs(double t,int d){
if(ans==m) return ;
if(t>m) return ;
if(t<=m&&t>ans) ans = t;
if(d==v.size()) return ;
if(v[d]+t>m) return ;
if(v[d]+t<m){
dfs(v[d]+t,d+1);
dfs(t,d+1);
}
else if(v[d]+t==m){
ans = v[d]+t;
return ;
}
}