关于贪心做dp
  • 板块灌水区
  • 楼主甄黫陻堙
  • 当前回复6
  • 已保存回复6
  • 发布时间2020/10/27 17:11
  • 上次更新2023/11/5 09:44:33
查看原帖
关于贪心做dp
352350
甄黫陻堙楼主2020/10/27 17:11

我有一种简单易懂,又臭又长的做法;把每种情况都算一下。

以P1060为例

#include<cstdio>
#include<algorithm>
using namespace std;
int n,m,ans=-1;
struct node{
	int w,v,h;
};
node a[30];
bool cmp(node x,node y){
	return x.v>y.v;
}
bool cnmd(node x,node y){
	return x.v<y.v;
}
bool cnnnd(node x,node y){
	return x.w<y.w;
}
bool ctmd(node x,node y){
	return x.w>y.w;
}
bool nmd(node x,node y){
	return x.h>y.h;
}
bool wdnmd(node x,node y){
	return x.h>y.h;
}
int main(){
	int k,js;
	scanf("%d%d",&n,&m);
	for(int i=1;i<=m;i++){
		scanf("%d%d",&a[i].w,&a[i].v);
		a[i].h=a[i].w*a[i].v;
	}
	
	sort(a+1,a+m+1,cmp);
	k=n,js=0;
	for(int i=1;i<=m;i++){
		if(k>=0){
			if(k-a[i].w>=0){
				js+=a[i].w*a[i].v;
				k-=a[i].w;
			}
		}else break;	
	}
	if(js>ans)ans=js;
	
	sort(a+1,a+m+1,cnmd);
	k=n,js=0;
	for(int i=1;i<=m;i++){
		if(k>=0){
			if(k-a[i].w>=0){
				js+=a[i].w*a[i].v;
				k-=a[i].w;
			}
		}else break;	
	}
	if(js>ans)ans=js;
	
	sort(a+1,a+m+1,cnnnd);
	k=n,js=0;
	for(int i=1;i<=m;i++){
		if(k>=0){
			if(k-a[i].w>=0){
				js+=a[i].w*a[i].v;
				k-=a[i].w;
			}
		}else break;	
	}
	if(js>ans)ans=js;
	
	sort(a+1,a+m+1,ctmd);
	k=n,js=0;
	for(int i=1;i<=m;i++){
		if(k>=0){
			if(k-a[i].w>=0){
				js+=a[i].w*a[i].v;
				k-=a[i].w;
			}
		}else break;	
	}
	if(js>ans)ans=js;
	
	sort(a+1,a+m+1,nmd);
	k=n,js=0;
	for(int i=1;i<=m;i++){
		if(k>=0){
			if(k-a[i].w>=0){
				js+=a[i].w*a[i].v;
				k-=a[i].w;
			}
		}else break;	
	}
	if(js>ans)ans=js;
	
	sort(a+1,a+m+1,wdnmd);
	k=n,js=0;
	for(int i=1;i<=m;i++){
		if(k>=0){
			if(k-a[i].w>=0){
				js+=a[i].w*a[i].v;
				k-=a[i].w;
			}
		}else break;	
	}
	if(js>ans)ans=js;
	printf("%d",ans);
	return 0;
}
2020/10/27 17:11
加载中...