zoukankan      html  css  js  c++  java
  • 【解题报告】洛谷P1021 邮票面值设计

    【解题报告】洛谷P1021 邮票面值设计

    题目链接

    https://www.luogu.com.cn/problem/P1021

    思路

    这道题目,首先要用固定的邮票数量和固定的种类表示出最大的数目以内的所有数字

    所以我们就对其进行分析

    首先1肯定要选,然后呢?

    我们发现这个时候从1到n都能表示出来了,然后呢?

    我们从1到n枚举选择第二种邮票,然后以此类推

    直到找到可以表示总共最大的为止

    这个时候呢我们就要用动态规划

    我们记录一个 (f[i]) 表示选到了第 (i) 张邮票,选多少个选到了这里

    然后我们就进行动态规划就可以了

    #include <iostream>
    #include <cstdio>
    #include <algorithm>
    #include <cstring>
    #include <string>
    using namespace std;
    int n,k;
    int a[20],ans[20];
    int f[50005];
    int mx=0;
    int work(int x)
    {
    	memset(f,0x3f3f3f,sizeof(f));
    	f[0]=0;
    	for(int i=1;i<=x;i++)
    	{
    		for(int j=a[i];j<=a[x]*n;j++)
    		{
    			if(f[j-a[i]]<n)
    			f[j]=min(f[j],f[j-a[i]]+1);
    		}
    	}
    	int sol=0;
    	while(f[sol]<=100)
    	sol++;
    	return sol;
    }
    void dfs(int x)
    {
    	if(x==k+1)
    	{
    		int t=work(x-1);
    		if(t>mx)
    		{
    			mx=t;
    			memcpy(ans,a,sizeof(ans));
    		}
    		return ;
    	}
    	int end=work(x-1);
    	for(int i=a[x-1]+1;i<=end+1;i++)
    	{
    		a[x]=i;
    		dfs(x+1);
    		a[x]=0;//回溯 
    	}
    }
    int main()
    {
    	cin>>n>>k;
    	a[1]=1;
    	dfs(2);
    	for(int i=1;i<=k;i++)
    	cout<<ans[i]<<" ";
    	cout<<'
    ';
    	cout<<"MAX="<<mx-1<<'
    ';
    	return 0;
    }
    
    本博文为wweiyi原创,若想转载请联系作者,qq:2844938982
  • 相关阅读:
    MySQL不支持的特性
    MySQL查询执行路径
    MySQL索引
    索引的选择性
    MySQL学习笔记_时间,多表更新,数据库元数据
    PowerDesigner 小技巧
    linux下清空文件内容
    mysql跟踪sql
    Navicat For Mysql快捷键
    PHP 配置多站点多目录
  • 原文地址:https://www.cnblogs.com/wweiyi2004/p/15401767.html
Copyright © 2011-2022 走看看