一.点菜问题
1.题面:
2.题解:
01背包问题
3.ac代码:
#include<stdio.h>
#include<bits/stdc++.h>
#include<iostream>
#include<string.h>
#include<stdlib.h>
//long long int dp2[400000],dp1[400000],a[400000];
using namespace std;
typedef long long ll;
int main(){
int c,n;
int i,j;
int dp[10001];
int v[10001],p[10001];
while(cin>>c>>n) {
for(i=1;i<=n;i++){
cin>>p[i]>>v[i];
}
memset(dp,0,sizeof(dp));
for(i=1;i<=n;i++){
for(j=c;j>=p[i];j--){
dp[j]=max(dp[j],dp[j-p[i]]+v[i]);
}
}
cout<<dp[c]<<endl;
}
}
二.最大报销额
1.题面:
2.题解:
实质是01背包
3.ac代码:
牛客ac代码
一样的代码通过了牛客,卡在了codeup上,错了一半。。
#include<stdio.h>
#include<bits/stdc++.h>
#include<iostream>
#include<string.h>
#include<stdlib.h>
#define N 300010
using namespace std;
typedef long long ll;
int v[N];
double dp[N];
int main(){
double q;
int i,j,n;
double a,b,c;
double temp;
char s;
int t;
int k;
while(~scanf("%lf%d",&q,&n)&&n){
k=1;
for(i=0;i<n;i++){
a=0,b=0,c=0;
cin>>t;
int flag=0;
while(t--){
getchar();
scanf("%c:%lf",&s,&temp);
if(s=='A')
a+=temp;
else if(s=='B')
b+=temp;
else if(s=='C')
c+=temp;
else
flag=-1;
if(a>600||b>600||c>600)
flag=-1;
}
if(flag==0&&(a+b+c)<=1000){
v[k++]=(a+b+c)*100;
}
}
int m=q*100;
memset(dp,0,sizeof(dp));
for(i=1;i<k;i++){
for(j=m;j>=v[i];j--){
dp[j]=max(dp[j],dp[j-v[i]]+v[i]);
}
}
//cout<<dp[m]<<endl;
printf("%.2lf\n",dp[m]/100);
}
}
三.毕业bg
1.题面:
2.题解:
01背包,开始死活看不懂,看懂了后,公式也出来了,结果卡了半天,后来才发现,排序只排了c,其他没变。。。真该啊
3.ac代码:
#include<stdio.h>
#include<bits/stdc++.h>
#include<iostream>
#include<string.h>
#include<stdlib.h>
#define N 300010
using namespace std;
typedef long long ll;
ll dp[N],t[N];
typedef struct bg{
int a;
int b;
int c;
}BG;
BG bg[N];
int com(BG a,BG b){
return a.c<b.c;
}
int main(){
int n;
int i,j;
while(cin>>n){
if(n<0)
break;
int maxn=-1;
for(i=0;i<n;i++){
cin>>bg[i].a>>bg[i].b>>bg[i].c;
if(maxn<bg[i].c)
maxn=bg[i].c;
}
//printf("***********\n");
memset(dp,0,sizeof(dp));
// memset(t,0,sizeof(t));
sort(bg,bg+n,com);
for(i=0;i<n;i++){
for(j=bg[i].c;j>=bg[i].b;j--){
dp[j]=max(dp[j],dp[j-bg[i].b]+bg[i].a);
}
// for(j=1;j<=maxn;j++)
// printf("%d ",dp[j]);
// cout<<endl;
}
//printf("***********\n");
int ans=-1;
for(j=maxn;j>=1;j--){
if(ans<dp[j])
ans=dp[j];
}
cout<<ans<<endl;
}
}