科技行者

行者学院 转型私董会 科技行者专题报道 网红大战科技行者

知识库

知识库 安全导航

至顶网软件频道应用软件由1,2,3,4,1.1组合小于6的组合一共有多少种,什么算法可以完全遍历出来

由1,2,3,4,1.1组合小于6的组合一共有多少种,什么算法可以完全遍历出来

  • 扫一扫
    分享文章到微信

  • 扫一扫
    关注官方公众号
    至顶头条

由1,2,3,4,1.1组合小于6的组合一共有多少种,什么算法可以完全遍历出来

作者:csdn 来源:csdn 2009年12月15日

关键字: 问答

  • 评论
  • 分享微博
  • 分享邮件

由1,2,3,4,1.1组合小于6的组合一共有多少种,什么算法可以完全遍历出来

由1,2,3,4,1.1组合小于6的组合一共有多少种,什么算法可以完全遍历出来
可以是
1 <6
1,1 <6
1,2 <6
1,2,3 <6
2,2 <6

都可以自身可以多次利用
怎么能遍历出来所有的呢

 

        static void Main(string[] args)
        {
            double[] array = { 1, 2, 3, 4, 1.1 };
            GetCombination(array);
        }
        static string GetBinaryString(int n, int length)
        {
            string result = string.Empty;
            double mod = 0;
            while (n != 0)
            {
                mod = n % 2;
                n = n / 2;
                result = mod.ToString() + result;
            }
            if (result.Length < length)
                result = result.PadLeft(length, '0');
            return result;
        }

        static void GetCombination(double[] nums)
        {
            double count = Math.Pow(2, nums.Length);
            for (int i = 1; i <= count - 1; i++)
            {
                string str = GetBinaryString(i, nums.Length);
                double sum = 0;
                List<double> list = new List<double>();
                for (int j = 0; j < str.Length; j++)
                {
                    if (str[j] == '1')
                    {
                        list.Add(nums[j]);
                        sum += nums[j];
                    }
                }
                if (sum < 6)
                {
                    Console.WriteLine("可能的组合有:{0} 和为:{1}", string.Join(",", Array.ConvertAll<double, string>(list.ToArray(), Convert.ToString)), sum);
                }
            }
            for (int i = 0; i < nums.Length; i++)
            {
                double sum = 0;
                int index = 0;
                while ((sum + nums[i]) < 6)
                {
                    sum += nums[i];
                    if (sum < 6)
                        index++;
                }
                Console.WriteLine("可能的组合有:{0}个{1} 和为{2}", index, nums[i], sum);
            }
        }

 

输出为:
可能的组合有:1.1 和为:1.1
可能的组合有:4 和为:4
可能的组合有:4,1.1 和为:5.1
可能的组合有:3 和为:3
可能的组合有:3,1.1 和为:4.1
可能的组合有:2 和为:2
可能的组合有:2,1.1 和为:3.1
可能的组合有:2,3 和为:5
可能的组合有:1 和为:1
可能的组合有:1,1.1 和为:2.1
可能的组合有:1,4 和为:5
可能的组合有:1,3 和为:4
可能的组合有:1,3,1.1 和为:5.1
可能的组合有:1,2 和为:3
可能的组合有:1,2,1.1 和为:4.1
可能的组合有:5个1 和为5
可能的组合有:2个2 和为4
可能的组合有:1个3 和为3
可能的组合有:1个4 和为4
可能的组合有:5个1.1 和为5.5

按我的理解(每个数都可以自身可以多次利用)
输出为:
1
1 1
1 1 1
1 1 1 1
1 1 1 1 1
1 1 1 1 1.1
1 1 1 1.1
1 1 1 1.1 1
1 1 1 1.1 1.1
1 1 1 2
1 1 1.1
1 1 1.1 1
1 1 1.1 1 1
1 1 1.1 1 1.1
1 1 1.1 1.1
1 1 1.1 1.1 1
1 1 1.1 1.1 1.1
1 1 1.1 2
1 1 2
1 1 2 1
1 1 2 1.1
1 1 3
1 1.1
1 1.1 1
1 1.1 1 1
1 1.1 1 1 1
1 1.1 1 1 1.1
1 1.1 1 1.1
1 1.1 1 1.1 1
1 1.1 1 1.1 1.1
1 1.1 1 2
1 1.1 1.1
1 1.1 1.1 1
1 1.1 1.1 1 1
1 1.1 1.1 1 1.1
1 1.1 1.1 1.1
1 1.1 1.1 1.1 1
1 1.1 1.1 1.1 1.1
1 1.1 1.1 2
1 1.1 2
1 1.1 2 1
1 1.1 2 1.1
1 1.1 3
1 2
1 2 1
1 2 1 1
1 2 1 1.1
1 2 1.1
1 2 1.1 1
1 2 1.1 1.1
1 2 2
1 3
1 3 1
1 3 1.1
1 4
1.1
1.1 1
1.1 1 1
1.1 1 1 1
1.1 1 1 1 1
1.1 1 1 1 1.1
1.1 1 1 1.1
1.1 1 1 1.1 1
1.1 1 1 1.1 1.1
1.1 1 1 2
1.1 1 1.1
1.1 1 1.1 1
1.1 1 1.1 1 1
1.1 1 1.1 1 1.1
1.1 1 1.1 1.1
1.1 1 1.1 1.1 1
1.1 1 1.1 1.1 1.1
1.1 1 1.1 2
1.1 1 2
1.1 1 2 1
1.1 1 2 1.1
1.1 1 3
1.1 1.1
1.1 1.1 1
1.1 1.1 1 1
1.1 1.1 1 1 1
1.1 1.1 1 1 1.1
1.1 1.1 1 1.1
1.1 1.1 1 1.1 1
1.1 1.1 1 1.1 1.1
1.1 1.1 1 2
1.1 1.1 1.1
1.1 1.1 1.1 1
1.1 1.1 1.1 1 1
1.1 1.1 1.1 1 1.1
1.1 1.1 1.1 1.1
1.1 1.1 1.1 1.1 1
1.1 1.1 1.1 1.1 1.1
1.1 1.1 1.1 2
1.1 1.1 2
1.1 1.1 2 1
1.1 1.1 2 1.1
1.1 1.1 3
1.1 2
1.1 2 1
1.1 2 1 1
1.1 2 1 1.1
1.1 2 1.1
1.1 2 1.1 1
1.1 2 1.1 1.1
1.1 2 2
1.1 3
1.1 3 1
1.1 3 1.1
1.1 4
2
2 1
2 1 1
2 1 1 1
2 1 1 1.1
2 1 1.1
2 1 1.1 1
2 1 1.1 1.1
2 1 2
2 1.1
2 1.1 1
2 1.1 1 1
2 1.1 1 1.1
2 1.1 1.1
2 1.1 1.1 1
2 1.1 1.1 1.1
2 1.1 2
2 2
2 2 1
2 2 1.1
2 3
3
3 1
3 1 1
3 1 1.1
3 1.1
3 1.1 1
3 1.1 1.1
3 2
4
4 1
4 1.1

 



#include "stdafx.h"
#include <iostream.h>

int main(int argc, char* argv[])
{

int i,j,m,n,k;
int num=0;

for(i=0;i <6;i++)
for(j=0;j <3;j++)
for(m=0;m <2;m++)
for(n=0;n <2;n++)
for(k=0;k <6;k++)
if(i+2*j+3*m+4*n+k*1.1 <6)
{
cout < <i < <" " < <j < <" " < <m < <" " < <n < <" " < <k < <endl;
num++;
}
cout < <num;

return 0;
}


输出依次为1 2 3 4 1.1 个数。 每一行就是一个组合  num是总共的组合数,方法没什么技巧,应该对了吧?

 

<?php
$num=array("0"=>"1","1"=>"2","2"=>"3","3"=>"4");
for($o=0;$o <ceil(6/$num[0]);$o++){
for($p=0;$p <ceil(6/$num[1]);$p++){
for($q=0;$q <ceil(6/$num[2]);$q++){
for($r=0;$r <ceil(6/$num[3]);$r++){
if(($o*$num[0]+$p*$num[1]+$q*$num[2]+$r*$num[3]) <6&&($o+$p+$q+$r)>1){
for($i=0;$i <$o;$i++) echo $num[0];
for($i=0;$i <$p;$i++) echo $num[1];
for($i=0;$i <$q;$i++) echo $num[2];
for($i=0;$i <$r;$i++) echo $num[3];
echo " <br/>";
}
}
}
}
}
?>

 

 


#include <iostream>
#include <iomanip>
#include <vector>
#include <stack>
#include <algorithm>
#include <functional>
#include <numeric>

using namespace std;
int main(){
typedef vector <double> vd;
typedef vector <vd> vvd;
typedef stack <vd> svd;

double init[] = { 1, 2, 3, 4, 1.1 };
double max = 6;
const int sz = sizeof init / sizeof *init;
sort( init, init + sz,greater <double>() );

vvd result;
svd records;
for( int i = 0; i < sz; i++ ){
vd item;
item.push_back( init[i] );
records.push( item );
}

while( !records.empty() ){
vd item = records.top();
records.pop();
result.push_back( item );

double cur = accumulate( item.begin(), item.end(), 0 );
for( int i = distance( init, find( init, init + sz, item.back() ) ); i < sz; i++ ){
if( cur + init[i] < max ){
item.push_back( init[i] );
records.push( vd( item ) );
item.pop_back();
}
}
}

for( vvd::iterator iter = result.begin(); iter != result.end(); ++iter ){
for( vd::iterator it = (*iter).begin(); it != (*iter).end(); ++it )
cout < < setw(4) < < *it < < ",";
cout < < endl;
}
return 0;
}
 

#include <iostream>
#include <iomanip>
#include <vector>
#include <stack>
#include <algorithm>
#include <functional>
#include <numeric>

using namespace std;
int main(){
typedef vector <double> vd;
typedef vector <vd> vvd;
typedef stack <vd> svd;

double init[] = { 1, 2, 3, 4, 1.1 };
double max = 6;
const int sz = sizeof init / sizeof *init;
sort( init, init + sz,greater <double>() );

vvd result;
svd records;
for( int i = 0; i < sz; i++ ){
vd item;
item.push_back( init[i] );
records.push( item );
}

while( !records.empty() ){
vd item = records.top();
records.pop();
result.push_back( item );

double cur = accumulate( item.begin(), item.end(), 0 );
for( int i = distance( init, find( init, init + sz, item.back() ) ); i < sz; i++ ){
if( cur + init[i] < max ){
item.push_back( init[i] );
records.push( vd( item ) );
item.pop_back();
}
}
}

for( vvd::iterator iter = result.begin(); iter != result.end(); ++iter ){
for( vd::iterator it = (*iter).begin(); it != (*iter).end(); ++it )
cout < < setw(4) < < *it < < ",";
cout < < endl;
}
return 0;
}


    • 评论
    • 分享微博
    • 分享邮件
    邮件订阅

    如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。

    重磅专题
    往期文章
    最新文章