萌新刚学01背包,只能过样例WA on #3,求dalao查错
  • 板块CF864E Fire
  • 楼主Miraik
  • 当前回复19
  • 已保存回复19
  • 发布时间2020/8/4 23:40
  • 上次更新2023/11/6 21:16:56
查看原帖
萌新刚学01背包,只能过样例WA on #3,求dalao查错
236862
Miraik楼主2020/8/4 23:40

RT,感觉思路没啥问题啊

#include<bits/stdc++.h>
using namespace std;
inline int read(){
	int x=0,f=1;char c=getchar();
	while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();}
	while(c>='0'&&c<='9'){x=(x<<1)+(x<<3)+(c^48);c=getchar();}
	return x*f;
}
int n,f[2005],cnt[2005],ans[2005][105],out;
struct Fire{
	int t,d,p,x;
}a[105];
bool cmp(Fire a,Fire b){
	return a.d<a.d;
}
int main(){
	n=read();
	for(int i=1;i<=n;i++)a[i].t=read(),a[i].d=read(),a[i].p=read(),a[i].x=i;
	sort(a+1,a+n+1,cmp);
	for(int i=1;i<=n;i++)
		for(int j=a[i].d-1;j>=a[i].t;j--)
		    if(f[j]<f[j-a[i].t]+a[i].p){
		    	f[j]=f[j-a[i].t]+a[i].p;
		    	cnt[j]=cnt[j-a[i].t];
		    	for(int k=1;k<=cnt[j];k++)
		    	    ans[j][k]=ans[j-a[i].t][k];
		    	ans[j][++cnt[j]]=a[i].x;
		    }
	for(int i=0;i<=2000;i++)
	    if(f[out]<f[i])out=i;
	//printf("%d\n",out);
	printf("%d\n%d\n",f[out],cnt[out]);
	for(int i=1;i<=cnt[out];i++)printf("%d ",ans[out][i]);
	return 0;
}

2020/8/4 23:40
加载中...