2021-01-15DP

1. Problema de pedido

1 pregunta:

Inserte la descripción de la imagen aquí

2. Solución de problemas:

01 problema de mochila

3.ac código:

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

	
}

2. Reembolso máximo

1 pregunta:

Inserte la descripción de la imagen aquí

2. Solución de problemas:

Mochila Essentially 01

3.ac código:

Código Niuke 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);
	}

}

3. Graduación bg

1 pregunta:

Inserte la descripción de la imagen aquí

2. Solución de problemas:

Mochila 01, no pude entenderlo todo el tiempo. Después de entenderlo, salió la fórmula. El resultado estuvo estancado por mucho tiempo. Luego me enteré que el orden solo estaba en el puesto c, y los demás se mantuvieron sin cambios. . . Realmente lo merezco

3.ac código:

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


}

Supongo que te gusta

Origin blog.csdn.net/weixin_46064382/article/details/112685838
Recomendado
Clasificación