zoukankan      html  css  js  c++  java
  • uva-165-枚举

    题意:选取k种面额的邮票,总数是h,要求组合出来的连续数最大

    枚举,网上看到一个更快的等价类划分,留着学等价类划分的思路

    #include<stdio.h>
    #include<iostream>
    #include<sstream>
    #include<queue>
    #include<map>
    #include<memory.h>
    #include <math.h>
    #include<time.h>
    #include <stdlib.h>
    #include <algorithm>
    using namespace std;
    const int N = 200;
    int res[N], stamp[N], m[N];
    int h, k;
    int final = -1;
    int vis[N];
    void dfs(int cur, int n, int sum)
    {
    	if(cur == h)
    	{
    		vis[sum] = 1;
    		return;
    	}
    	vis[sum] = 1;
    	for(int i = 0; i <= n; i++)
    		dfs(cur + 1, n, sum + stamp[i]);
    }
    void search(int cur)
    {
    	if(cur == k)
    	{
    		if(m[cur - 1] > final)
    		{
    			final = m[cur - 1];
    			memcpy(res, stamp, sizeof(res));
    		}
    		return;
    	}
    	for(int i = stamp[cur-1] + 1; i <= m[cur - 1] + 1; i++)
    	{
    		memset(vis, 0, sizeof(vis));
    		stamp[cur] = i;
    		dfs(0, cur, 0);
    		int j = 1;
    		int num = 0;
    		while (vis[j++])
    			num++;
    		m[cur] = num;
    		search(cur + 1);
    	}
    
    }
    int main()
    {
    	freopen("d:\1.txt", "r", stdin);
    	while (cin >> h >> k && h && k)
    	{
    		m[0] = h;
    		stamp[0] = 1;
    		final = -1;
    		search(1);
    		for(int i = 0; i < k;i++)
    		{
    			printf("%3d",res[i]);
    		}
    		printf(" ->%3d
    ",final);
    	}
    	return 0;
    }
    

      

  • 相关阅读:
    Git标签使用技巧
    Git入门基本概述
    过滤器+缓存在.NET5WebApi项目中的简单使用
    在.NET5中 使用JWT鉴权授权
    Git常用开发命令
    时间戳的实际使用
    两个日期字段相减,进行计算
    MQ的理论理解
    第一周学习C语言的总结!
    问题(the question)
  • 原文地址:https://www.cnblogs.com/shuiyonglewodezzzzz/p/7636197.html
Copyright © 2011-2022 走看看