C - Make Them Equal

#include<iostream>
#include<cstring>
using namespace std;
const int N=1010;
int ans[N][40010],c[N],b[N],a[N];
int main()
{
	int t ;
	cin>>t;
	for(int i=1;i<=1000;i++)a[i]=1010;
	a[1]=0;
	for(int i=1;i<=1010;i++)
	{	
		for(int j=i;j>=1;j--)
	  	{
		  int x=i+i/j;
		  if(x<=1000)a[x]=min(a[x],a[i]+1);
		}
	}
	while(t--)
	{
		int n,m;
		cin>>n>>m;
		m = min(m, n * 13);
		for(int i=1;i<=n;i++)cin>>b[i],b[i] = a[b[i]];
		for(int i=1;i<=n;i++)cin>>c[i];
		for(int i=1;i<=n;i++)
		{
			for(int j=0;j<=m;j++)
			{
				ans[i][j]=ans[i-1][j];
				if(j >= b[i]){
					ans[i][j]=max(ans[i-1][j-b[i]]+c[i],ans[i][j]);
				}
			}
		}
		cout<<ans[n][m]<<endl;
	}
	return 0;
}
CF
先模拟出1变为x所需的最小次数,在转化为01背包问题
难点是如何求出1变为x的最小次数,在队里大哥的指导下,终于明白了,不能强硬的去求次数。
而是看一个数可以转化为哪些数,次数一次一次的加,这样就变得简单了。
全部评论

相关推荐

牛舌:如果我不想去,不管对方给了多少,我一般都会说你们给得太低了。这样他们就会给下一个offer的人更高的薪资了。
点赞 评论 收藏
分享
评论
点赞
收藏
分享
牛客网
牛客企业服务