二进制优化时是否存数组RE变AC不明白原理求神犇解惑
  • 板块P1833 樱花
  • 楼主herobrineqlh
  • 当前回复0
  • 已保存回复0
  • 发布时间2023/1/11 11:32
  • 上次更新2023/10/24 04:46:33
查看原帖
二进制优化时是否存数组RE变AC不明白原理求神犇解惑
767459
herobrineqlh楼主2023/1/11 11:32
RE代码:边读入边二进制拆分
#include<iostream>
#include<math.h>
using namespace std;
const int N=10010,M=1010;
int f[M];
int v[N*4],w[N*4];
int hh1,tt1,hh2,tt2,n;
int main()
{
	scanf("%d:%d",&hh1,&tt1);
	scanf("%d:%d",&hh2,&tt2);
	int m=(hh2*60+tt2)-(hh1*60+tt1);
	scanf("%d",&n);
	int cnt=0;
	for(int i=1;i<=n;i++)
	{
		int a,b,s;
		scanf("%d%d%d",a,b,s);
		if(s==0)s=999999;
		int k=1;
		while(k<=s)
		{
			v[++cnt]=a*k;
			w[cnt]=b*k;
			s-=k;
			k*=2;
		}
		if(s>0)
		{
			v[++cnt]=a*s;
			w[cnt]=b*s;
		}
	}
	n=cnt;
	for(int i=1;i<=cnt;i++)
	{
		for(int j=m;j>=v[i];j--)
		{
			f[j]=max(f[j],f[j-v[i]]+w[i]);
		}
	}
	printf("%d",f[m]);
	return 0;
}
AC代码:读入数组存下来以后在调用数组二进制拆分
#include<iostream>
#include<math.h>
using namespace std;
const int N=100010,M=100010;
int f[M];
int v[N*4],w[N*4];
int a[N],b[N],c[N];
int hh1,tt1,hh2,tt2,n;
int main()
{
	scanf("%d:%d",&hh1,&tt1);
	scanf("%d:%d",&hh2,&tt2);
	int m=(hh2*60+tt2)-(hh1*60+tt1);
	scanf("%d",&n);
	int cnt=0;
	for(int i=1;i<=n;i++)
	{
		scanf("%d%d%d",&a[i],&b[i],&c[i]);
		if(c[i]==0)c[i]=999999;
	}
	for(int i=1;i<=n;i++)
	{
		int k=1;
		while(k<=c[i])
		{
			v[++cnt]=a[i]*k;
			w[cnt]=b[i]*k;
			c[i]-=k;
			k*=2;
		}
		if(c[i]>0)
		{
			v[++cnt]=a[i]*c[i];
			w[cnt]=b[i]*c[i];
		}
	}
	n=cnt;
	for(int i=1;i<=cnt;i++)
	{
		for(int j=m;j>=v[i];j--)
		{
			f[j]=max(f[j],f[j-v[i]]+w[i]);
		}
	}
	printf("%d",f[m]);
	return 0;
}

不明白原理求助
2023/1/11 11:32
加载中...