由1,2,3,4,1.1组合小于6的组合一共有多少种,什么算法可以完全遍历出来
可以是
1<6
1,1<6
1,2<6
1,2,3<6
2,2<6都可以自身可以多次利用
怎么能遍历出来所有的呢

解决方案 »

  1.   


            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
      

  2.   

    代码:namespace Program
    {
        public class Package
        {
            public double[] goods = new double[] { 1, 1.1, 2, 3, 4 };        /// <summary>
            /// 用递归算出
            /// </summary>
            /// <param name="puts">目前放入背包的数</param>
            /// <param name="unPuts">可放入背包的数</param>
            /// <param name="sum">背包还剩的容量</param>
            public void ShowComposes(List<double> puts,double[] unPuts, double sum)
            {
                //输出当前放入背包符合条件的所有数
                bool exist = false;
                foreach (double d in puts)
                {
                    System.Console.Write(d+ " ");
                    exist = true;
                }
                if(exist)
                    System.Console.WriteLine();            //在可放入背包的数字中,选择可放的数并放进背包
                foreach (double d in unPuts)
                {
                    if (d < sum)
                    {
                        List<double> newPuts = puts.ToList<double>();
                        newPuts.Add(d);
                        ShowComposes(newPuts, goods, sum - d);
                    }
                }
            }        static void Main(string[] args)
            {
                Package p = new Package();
                p.ShowComposes(new List<double>(), p.goods, 6);
            }
        }
    }
      

  3.   

    等于6也算?那就把<6都换成<=6
      

  4.   

    谢谢笑天依,ojlovecd 和大家了我仔细看看
      

  5.   

    错误 1 “System.Collections.Generic.List<double>”并不包含“ToList”的定义
      

  6.   

    你用vs2005?vs2008没问题的(有linq)其实那行就是复制一个一模一样的list
      

  7.   

    System.Collections.Generic.List <double>”并不包含“ToList”的定义
    vs2005中怎么写
      

  8.   

    List<double> newPuts = puts.GetRange(0, puts.Count);
      

  9.   


    闭着眼睛乱写!麻烦你先调试一下:puts.ToList()
      

  10.   

    由1,2,3,4,1.1组合小于6的组合一共有多少种,什么算法可以完全遍历出来 
    可以是 
    1 <6 
    1,1 <6 
    1,2 <6 
    1,2,3 <6 
    2,2 <6 都可以自身可以多次利用 
    怎么能遍历出来所有的呢
       努力!
      

  11.   


     
    #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是总共的组合数,方法没什么技巧,应该对了吧?
      

  12.   

    http://www.xabaoan.cn
      

  13.   

    <?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/>";
    }
    }
    }
    }
    }
    ?>
      

  14.   


    #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;
    }时间复杂度大了点,没做优化。
      

  15.   


    #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;
    }
    这样应该能看了
      

  16.   


    #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; 

      

  17.   

    /**
    *一个java版的背包
    *参照6楼
    */
    import java.lang.Double;
    import java.util.ArrayList;;public class Bags { 

         
         public void getData(ArrayList<Double>bags, double []data, double Total)
         {
             //打印bags内容
              boolean flag= false;
             for(int i=0;i<bags.size();i++){
              Double d = bags.get(i);
              System.out.print(d.toString() + "+");
                     flag= true;
             }
          
             if(flag){
              System.out.println();
             }         //在数字中循环,依次调用函数,递归结束的条件是找不到data[i] < Total的情况
              //了         
             for(int i=0;i<data.length;i++){
              
              if (data[i] < Total){
              ArrayList<Double> newPuts = new ArrayList();
              for(int j=0;j<bags.size();j++){
              newPuts.add(bags.get(j));
                     }
              
                     newPuts.add(Double.valueOf(data[i]));
                     getData(newPuts, datas, Total-data[i]);
                 }
             }
      
         }
         public double[] datas= new double[] { 1, 1.1, 2, 3, 4 };
     public static void main(String []args) {
     Bags p = new Bags();
             p.getData(new ArrayList<Double>(), p.datas, 6);
     }
    }
      

  18.   

      一个题目做到那中水平了``
      呵呵`厉害拉``   不过我个人觉得似乎上面个那用.NET做的好点哦
     Java的复杂了点!
      

  19.   

    <script>alert("test");</script>