zoukankan      html  css  js  c++  java
  • 洛谷P1021邮票面值设计

    题目

    一道很经典的搜索题,可以锻炼搜索的能力,比如可以用dfs覆盖加dp的方式来寻找+更新答案。而且还可以通过在递归中增加数组的方式来辅助搜索。

    #include <bits/stdc++.h>
    using namespace std;
    int n, k, ans[101000], maxn, tot, a[101000];
    int ne(int pos, int maxnow)
    {
    	int dp[10100];
    	memset(dp, 4, sizeof(dp));//dp设为最大值。 
    	dp[0] = 0;
    	for (int i = 1; i <= pos; i++)
    		for (int j = a[i]; j <= a[pos] * n; j++)//dp判断需要几个数 
    			dp[j] = min(dp[j - a[i]] + 1, dp[j]);
    	for (int i = 1; i <= n * a[pos]; i++)
    		if (dp[i] > n)//如果i不行了,说明i-1可以 
    			return i - 1; 
    	return a[pos] * n;//返回最大值 
    }
    void dfs(int pos, int maxnow)//覆盖数组 
    {
    	if (pos == k + 1)
    	{
    		if (maxnow > maxn)
    		{
    			maxn = maxnow;
    			for (int i = 1; i <= k; i++)//更新答案 
    				ans[i] = a[i];
    		}
    		return;
    	}
    	for (int i = ans[pos - 1] + 1; i <= maxnow + 1; i++)
    	{
    		a[pos] = i;//每一个位置都加以判断。 
    		int maxx = ne(pos, maxnow);
    		dfs(pos + 1, maxx);
    	}
    }
    int main()
    {			  
    	scanf("%d%d", &n, &k);
    	dfs(1, 0);
    	for (int i = 1; i <= k; i++)
    		printf("%d ", ans[i]); puts("");
    	printf("MAX=%d", maxn);
    }			  
    
  • 相关阅读:
    UICollectionView
    UIDynamicPPT
    05-UIDynamic
    键盘处理return key-工具条
    源代码管理工具 git
    源代码管理工具
    核心动画09-CATransition转场动画
    核心动画06-时钟(了解)
    Intersect,Minus,union all 和union的区别
    freemarker大于,小于 gt,lt 的用法
  • 原文地址:https://www.cnblogs.com/liuwenyao/p/10863202.html
Copyright © 2011-2022 走看看