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的最小次数,在队里大哥的指导下,终于明白了,不能强硬的去求次数。
而是看一个数可以转化为哪些数,次数一次一次的加,这样就变得简单了。
全部评论

相关推荐

沉淀一会:1.同学你面试评价不错,概率很大,请耐心等待; 2.你的排名比较靠前,不要担心,耐心等待; 3.问题不大,正在审批,不要着急签其他公司,等等我们! 4.预计9月中下旬,安心过节; 5.下周会有结果,请耐心等待下; 6.可能国庆节前后,一有结果我马上通知你; 7.预计10月中旬,再坚持一下; 8.正在走流程,就这两天了; 9.同学,结果我也不知道,你如果查到了也告诉我一声; 10.同学你出线不明朗,建议签其他公司保底! 11.同学你找了哪些公司,我也在找工作。
点赞 评论 收藏
分享
牛舌:如果我不想去,不管对方给了多少,我一般都会说你们给得太低了。这样他们就会给下一个offer的人更高的薪资了。
点赞 评论 收藏
分享
评论
点赞
收藏
分享
牛客网
牛客企业服务