由1,2,3,4,1.1组合小于6的组合一共有多少种,什么算法可以完全遍历出来 由1,2,3,4,1.1组合小于6的组合一共有多少种,什么算法可以完全遍历出来可以是1<61,1<61,2<61,2,3<62,2<6都可以自身可以多次利用怎么能遍历出来所有的呢 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 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 代码: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); } }} 等于6也算?那就把<6都换成<=6 谢谢笑天依,ojlovecd 和大家了我仔细看看 错误 1 “System.Collections.Generic.List<double>”并不包含“ToList”的定义 你用vs2005?vs2008没问题的(有linq)其实那行就是复制一个一模一样的list System.Collections.Generic.List <double>”并不包含“ToList”的定义vs2005中怎么写 List<double> newPuts = puts.GetRange(0, puts.Count); 闭着眼睛乱写!麻烦你先调试一下:puts.ToList() 由1,2,3,4,1.1组合小于6的组合一共有多少种,什么算法可以完全遍历出来 可以是 1 <6 1,1 <6 1,2 <6 1,2,3 <6 2,2 <6 都可以自身可以多次利用 怎么能遍历出来所有的呢 努力! #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是总共的组合数,方法没什么技巧,应该对了吧? http://www.xabaoan.cn <?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;}这样应该能看了 #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; } /***一个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); }} 一个题目做到那中水平了`` 呵呵`厉害拉`` 不过我个人觉得似乎上面个那用.NET做的好点哦 Java的复杂了点! <script>alert("test");</script> 项目安装时重写Installer方法 不明白command.Parameters["ReturnValue"].Value这句代码 文件夹访问权限控制,允许调用,不允许URL访问 关于DateGridView控件自定义开发的问题 请叫下这个读取数据的方法需要怎么改下更提高性能 数据库的价格? 无锡的朋友注意了,PLC开发的需求。 一个很迷茫的问题,大家看一下好吗? 我发现DataGrid一个奇怪现象,不知道是不是一个漏洞,请高手来看看,谢谢! iis的web服务常无故停止,重装服务器也没有解决... 类似qq空间批量上传图片工具 怎样用C#生成一种随机颜色
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
{
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);
}
}
}
vs2005中怎么写
闭着眼睛乱写!麻烦你先调试一下:puts.ToList()
可以是
1 <6
1,1 <6
1,2 <6
1,2,3 <6
2,2 <6 都可以自身可以多次利用
怎么能遍历出来所有的呢
努力!
#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是总共的组合数,方法没什么技巧,应该对了吧?
$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;
}
这样应该能看了
#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;
}
*一个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);
}
}
呵呵`厉害拉`` 不过我个人觉得似乎上面个那用.NET做的好点哦
Java的复杂了点!