Имя пользователя:
Пароль:
 

Показать сообщение отдельно

редкий гость


Сообщения: 1696
Благодарности: 44

Профиль | Сайт | Отправить PM | Цитировать


Скачал моно. Прогнал простейший тест.

Итак, сначала моя программа в первый раз доведённая до работающего состояния (читай: в первый раз скормил компилятору и поправил очевидные очепятки).
Код: Выделить весь код
#include <stdio.h>

int main()
{
/*
	// тест, приведённый оригинальным автором поста
	int num[] = {
		197900,70584,65006,39893,27638,
		29448,17220,7750,39032,2870,
		2010,22386,93275,20090,10906,
		36162,4133,40180,64575,34440,
		6027,8754,22960,4879,22960,
		18311,39893,27638,58896,24108,
		22386,2727,36162,4879,4133,
		34440,5740,2727,15355,1665,
		34440,8610
		};
	const int n = sizeof(num)/sizeof(int);
	const int m = 350000;
*/
	// мой тест, вешает программу Влада
	const int n = 1000; // количество чисел в наборе
	int num[n]; // сами числа. Втупую подряд
	for (int i = 0; i < n; ++i)
		num[i] = 1+i;
	const int m = n*(n+1)/2-1; // сумма всех чисел, кроме первого

	int *way = new int[m+1];
	for (int i = 0; i <= m; ++i)
		way[i] = 0;

	way[0] = 1;

	for (int i = 0; i < n; ++i)
		for (int j = m; j > 0; --j)
			if (way[j] == 0 && j >= num[i] && way[j-num[i]] != 0)
				way[j] = num[i];

	if (!way[m])
	    printf("Всё плохо\n");
	else
	{
	    printf("Всё хорошо, путь:\n");
	    for (int i = m; i != 0; i -= way[i])
	        printf("%d\n", way[i]);
	}

	delete[] way;
	return 0;
}
Отрабатывает за секунду в случае "сложного" теста. Мгновенно на примере приведённом автором вопроса.

Программа влада с тем же синтетическим тестом. Не заканчивается никогда.
Код: Выделить весь код
using System;

namespace summ
{
    class Class1
    {
        static void su(int[] m, int[] s, int i, int p, int l, int size, int corsize)
        {
            for(;i < l; i++)
            {
                if(corsize + m[i] == size)
                {
                    for(int j = 0; j <= p; j ++)
                    {
                        Console.Write("{0} + ", m[s[j]]);
                    }

                    Console.WriteLine("{0} = {1};", m[i], size);
                }
                else if(corsize + m[i] < size)
                {
                    s[p + 1] = i;
                    su(m, s, i + 1, p + 1, l, size, corsize + m[i]);
                }
            }
        }

        static void summ(int[] m, int l, int size)
        {
            int[] s = new int[l];
            su(m, s, 0, -1, l, size, 0);            
        }

        static void Main(string[] args)
        {
            int l = 1000;
            int[] m = new int[l];

            for(int j = 0; j < l; j ++)
            {
                m[j] = j+1;
            }

            summ(m,l, l*(l+1)/2-1);
        }
    }
}

-------
http://ivank.ru


Отправлено: 03:41, 24-09-2006 | #15