Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 17.01.2013, 14:15   #1
Dezikk
 
Регистрация: 17.01.2013
Сообщений: 6
Вопрос Златопольский 8.47. Вложенные циклы

Имееться 10 гирь весом 100 200 300 500 1000 1200 1400 1500 2000 3000 грамм каждая. Сколькими способами гирями этого набора можно составить вес в v грамм.
Вот собственно к чему пришел, но не правильно. Помогите!

Код:
int v,vv,count=0;		//zlatopol 8.47
int g[10]={100,200,300,500,1000,1200,1400,1500,2000,3000};
cin>>v;
vv=v;
for (int j=9;j>=0;j--)
{
vv=v;
if (g[j]>vv) continue;
vv-=g[j];
if (vv==0) {count++;vv+=g[j];}
for (int i=j-1;i>=0;i--)
{
	if (g[i]>vv) continue;
	vv-=g[i];
	if (vv==0) {count++;vv+=g[i];}
}
}

cout<<count<<endl;

return 0;
}

Последний раз редактировалось Stilet; 18.01.2013 в 21:42.
Dezikk вне форума Ответить с цитированием
Старый 17.01.2013, 19:21   #2
Blind Guard
Форумчанин
 
Регистрация: 14.03.2012
Сообщений: 139
По умолчанию

Т.е., например, вес в 500 грамм можно собрать 5-ю способами?
Код:
100*5 = 500
100*3+200 = 500
100+200*2 = 500
100*2+300 = 500
200+300 = 500
Я правильно понял задание?
Blind Guard вне форума Ответить с цитированием
Старый 18.01.2013, 18:49   #3
Dezikk
 
Регистрация: 17.01.2013
Сообщений: 6
Печаль

Цитата:
Сообщение от Blind Guard Посмотреть сообщение
Т.е., например, вес в 500 грамм можно собрать 5-ю способами?
Код:
100*5 = 500
100*3+200 = 500
100+200*2 = 500
100*2+300 = 500
200+300 = 500
Я правильно понял задание?
Нет. В нашем распоряжении только по ОДНОЙ гире указанных весов. Те
1500=1500
1500=1400+100
1500=1200+300
1500=1200+200+100
1500=1000+500
1500=1000+300+200
Dezikk вне форума Ответить с цитированием
Старый 18.01.2013, 23:20   #4
Dezikk
 
Регистрация: 17.01.2013
Сообщений: 6
По умолчанию

Все, больше не знаю куда дальше. Некоторые правильно считает, некоторые нет. Скоро лопнет голова. Может я вообще не в те дебри полез?!
PHP код:
int v,vv,count=0;        //zlatopol 8.47
int g[10]={100,200,300,500,1000,1200,1400,1500,2000,3000};
cin>>v;
vv=v;
for (
int j=9;j>=0;j--)
{
    
vv=v;
    if (
g[j]>vv) continue;
for (
int i=j;i>=0;i--)
{
    if (
g[i]>vv) continue;
for (
int k=j;k>=0;k--)
{
    if (
g[k]>vv) continue;
    
vv-=g[k];
    if (
vv==0) {count++; break;}
}
    if (
vv==0) continue;
}
    if (
vv==0) continue;
}

cout<<count<<endl
Dezikk вне форума Ответить с цитированием
Старый 19.01.2013, 02:18   #5
Dezikk
 
Регистрация: 17.01.2013
Сообщений: 6
По умолчанию

Закройте пожалуйста тему, решение найдено.
Dezikk вне форума Ответить с цитированием
Старый 19.01.2013, 03:23   #6
sVasilich
Форумчанин
 
Аватар для sVasilich
 
Регистрация: 16.12.2009
Сообщений: 224
По умолчанию

А можно его выложить, раз найдено? Интересно

Сам долго думал над задачей. Придумал так, вроде даже работает, хотя, подозреваю что bitset нельзя было использовать:

Код:
int main()
{

	int desiredWeights;        //zlatopol 8.47 
	int poises[10]={100,200,300,500,1000,1200,1400,1500,2000,3000}; 
	cin>>desiredWeights; 
	
	int maxIndex = 0;
	for(int z=0; z<10; z++){
		if(poises[z]>desiredWeights)
			break;
		maxIndex=z;
	}


	
	int combinations = 0;
	int maxComb = pow((double)2,maxIndex+1);

	for(int curComb=0; curComb<maxComb; curComb++){
		bitset<10> mask(curComb);
		int tmpSum = 0;
		for(int i=0; i<=maxIndex; i++)
			if(mask.test(i))
				tmpSum+=poises[i];

		if(tmpSum==desiredWeights)
			++combinations;
	}

	cout<<combinations;
	cin.get();
}
Люди бывают 10 типов: те, кто понимают двоичную систему счисления, и те, кто не понимают...
sVasilich вне форума Ответить с цитированием
Старый 19.01.2013, 13:23   #7
Dezikk
 
Регистрация: 17.01.2013
Сообщений: 6
По умолчанию

Если кому то интересно , я пришел к такому решению. Но оно как всегда оказалось неправильным... Опять ...
PHP код:
Int v,vv,count=0;
int g[10]={100,200,300,500,1000,1200,1400,1500,2000,3000};
cin>>v;
vv=v;
for (
int j=9;j>=0;j--)
{
    
vv=v;
    if (
g[j]>vv) continue;
    
vv-=g[j];
    if (
vv==0) {count++; continue;}
for (
int i=j-1;i>=0;i--)
{
    if (
g[i]>vv) continue;
    
vv-=g[i];
    if (
vv==0) {count++; if (g[i]>200vv=g[i];}
for (
int k=i-1;k>=0;k--)
{
    if (
g[k]>vv) continue;
    
vv-=g[k];
    if (
vv==0) {count++; if (g[i]>200vv=g[k];}
}
}
}

cout<<count<<endl

А вот это ПРАВИЛЬНОЕ решение мне подсказали на соседнем форуме.
PHP код:
int g[10]={100,200,300,500,1000,1200,1400,1500,2000,3000};  
  
int masksumbitcount=0;
  
int v;
  
cin>>v
  for (
int i=1i<=0x3FF;i++){
    
mask=1sum=bit=0;
    while(
mask<=i){
      if(
i&masksum+=g[bit];
      
bit++;
      
mask<<=1;
    }
    if (
sum==vcount++;
  }
  
cout<<count<<endl
Но есть одно большое но! В выложенном правильном варианте используються функции, которые мы еще не рассматривали на занятиях, поэтому по идее препод:
1-либо лоханулся и дал слишком продвинутое задание
2- либо существует более простой вариант.
Собственно задача в учебнике Златопольского находиться в разделе "Вложенные циклы. Работа с целыми числами"... Вот такие пироги...
Dezikk вне форума Ответить с цитированием
Старый 19.01.2013, 13:27   #8
Dezikk
 
Регистрация: 17.01.2013
Сообщений: 6
По умолчанию

Цитата:
Сообщение от sVasilich Посмотреть сообщение

Сам долго думал над задачей. Придумал так, вроде даже работает, хотя, подозреваю что bitset нельзя было использовать:
Большое спасибо, но пока не имею возможности потестить предложенный вариант решения. Потом отпишусь

И кстати, какие заголовочные файлы подключать кроме math.h?
Dezikk вне форума Ответить с цитированием
Старый 19.01.2013, 13:35   #9
sVasilich
Форумчанин
 
Аватар для sVasilich
 
Регистрация: 16.12.2009
Сообщений: 224
По умолчанию

Вот:
Код:
#include <iostream>
#include <bitset>
#include <math.h>
Ну да, решение на соседнем форуме по такому же принципу, как моё, просто мне лень было вспоминать как со сдвигами работать и я доверил перевод из десятичной в двоичную контейнеру bitset.

По-моему, эта задача через вложенные циклы не решается. Либо маской, либо рекурсивными функциями. Хотя рекурсию я составить для этого случая тоже затрудняюсь.
Люди бывают 10 типов: те, кто понимают двоичную систему счисления, и те, кто не понимают...
sVasilich вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Вложенные циклы kex Помощь студентам 2 11.10.2010 18:25
Вложенные циклы. Arctopus Помощь студентам 11 20.02.2010 00:02
вложенные циклы!!!! for_tuna Помощь студентам 6 08.12.2009 07:07
вложенные циклы илька Помощь студентам 4 07.12.2009 09:53
Вложенные циклы Chief Паскаль, Turbo Pascal, PascalABC.NET 3 06.01.2009 16:34