2021-01-15DP

一.点菜问题

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;
	}


}

猜你喜欢

转载自blog.csdn.net/weixin_46064382/article/details/112685838