二进制50pts求调
查看原帖
二进制50pts求调
656774
ZhangWeiYue0203楼主2024/10/8 21:13

为什么做了二进制优化之后过不了了,纯的多重背包可以

优化后的部分哪里出了问题,请dalao指导


二进制优化:记录

#include<bits/stdc++.h>
using namespace std;

typedef long long ll;

ll n,de,f[1005],c[10005],p[10005],t[10005];

ll tin(){
	ll sh=0,sm=0,eh=0,em=0,res=0;
	scanf("%lld:%lld %lld:%lld",&sh,&sm,&eh,&em);
	res=(eh-sh)*60+em-sm;
	return res;
}

int main(){
	de=tin();
	scanf("%lld",&n);
	for(int i=1;i<=n;i++){
		scanf("%lld %lld %lld",&t[i],&c[i],&p[i]);
	}
	for(ll i=1;i<=n;i++){
		if(p[i]==0){
			for(ll j=t[i];j<=de;j++){
				f[j]=max(f[j],f[j-t[i]]+c[i]);
			}
		}else{
			ll num=p[i];
			for(ll k=1;k<=num;k*=2){
				for(ll j=de;j>=t[i];j--){
					f[j]=max(f[j],f[j-t[i]]+c[i]);
				}
				num-=k;
			}
			for(ll j=de;j>=t[i]*num;j--){
				f[j]=max(f[j],f[j-t[i]*num]+num*c[i]);
			}
		}
	}
	printf("%lld",f[de]);
	return 0;
}

无优化:记录

#include<bits/stdc++.h>
using namespace std;

typedef long long ll;

ll n,de,f[1005],c[10005],p[10005],t[10005];

ll tin(){
	ll sh=0,sm=0,eh=0,em=0,res=0;
	scanf("%lld:%lld %lld:%lld",&sh,&sm,&eh,&em);
	res=(eh-sh)*60+em-sm;
	//printf("%lld:%lld %lld:%lld %lld\n",sh,sm,eh,em,res);
	return res;
}

int main(){
	de=tin();
	scanf("%lld",&n);
	for(int i=1;i<=n;i++){
		scanf("%lld %lld %lld",&t[i],&c[i],&p[i]);
	}
	for(ll i=1;i<=n;i++){
		if(p[i]==0){
			for(ll j=t[i];j<=de;j++){
				f[j]=max(f[j],f[j-t[i]]+c[i]);
			}
		}else{
			for(int k=1;k<=p[i];k++){
				for(int j=de;j>=t[i];j--){
					f[j]=max(f[j],f[j-t[i]]+c[i]);
				}
			}
		}
	}
	printf("%lld",f[de]);
	return 0;
}
2024/10/8 21:13
加载中...