我不太懂上面写的,反正一盒都是同一种那就是说有11种可能性是吧。 我为了好算假设每盒只有一粒,结果是90-100,90是没有10g的,100就是全是10g的。这样做行么= =
int[] result = new int[11]; for (int i = 0; i <= 10; i++) { int j = 10 - i; result[i] = (i * 9) + (j * 10); }
嘿嘿,附上我求1-8行的代码(9的话真的求不下去咯,都2小时还没出来,10就更别说咯) #include <iostream> #include <iomanip> #include <cmath> using namespace std; #define ARRSIZE 10 //盒子的个数 #define MAXNUM 500 //盒子里药片的数量 int arr[ARRSIZE]; //这个函数主要是判断这个数组里的数字的子集和是否有相等的,如果相等返回false, //如果没有表明暂时这个数组符合要求,可以进行下一步查找 bool IsSubSetSum(int arr[], int iArrLen) { int iNum = (int)pow(2, iArrLen); int *paArr = new int[iNum-1]; //将每个子集的和存到这个数组元素中 int i, j, sum; for (i=1; i<iNum; i++) { sum = 0; for (j=0; j<iArrLen; j++) { if ((i&(1<<j)) != 0) { sum += arr[j]; //计算子集和 } } paArr[i-1] = sum; } for (i=0; i<iNum; i++) //判断是否有相等的元素,如果有直接返回false { for (j=i+1; j<iNum; j++) { if (paArr[i] == paArr[j]) { delete []paArr; return false; } } } delete []paArr; return true; //如果没有返回true } void PrintArr(int arr[], int iArrLen) { int i; for (i=0; i<iArrLen; i++) cout << arr[i] << " "; cout << endl; } void FindNum(int x, int N) { if (N == ARRSIZE) //如果N等于ARRSIZE,表示已找到N个符合要求的数,将他们打印出来 { PrintArr(arr, ARRSIZE); } else { for (arr[N]=x; arr[N]<=MAXNUM; arr[N]++) //从x开始赋值, { if (IsSubSetSum(arr, N+1)) //如果满足条件,继续查找下一个元素,没有的话,arr[N] += 1; { FindNum(arr[N]+1, N+1); } } } } int main() { FindNum(1,0); return 0; }
[quote=引用 31 楼 skyliuxu 的回复:] [quote=引用 29 楼 hbu_pig 的回复:] 我怎么感觉这个好简单。 从第一个瓶子里面取1粒, 第二个瓶子里面取2粒, 第三个瓶子里面取4粒, 。。。 第10个瓶子里面取256(2的9次方)粒, 这样称一次就好了。 结果很好分析啊。 (1+2+4+。。。+256)=511 设称出来的重量为X 则5110-X等于哪些之和,哪些就装的9g [quote=引用 5 楼 FancyMouse 的回复:] 339 416 456 476 487 493 496 498 499 500 现在有点空,稍微写了个程序马上跑出了这个解。当然我比较蠢,心算我是肯定算不出的。
[quote=引用 29 楼 hbu_pig 的回复:] 我怎么感觉这个好简单。 从第一个瓶子里面取1粒, 第二个瓶子里面取2粒, 第三个瓶子里面取4粒, 。。。 第10个瓶子里面取256(2的9次方)粒, 这样称一次就好了。 结果很好分析啊。 (1+2+4+。。。+256)=511 设称出来的重量为X 则5110-X等于哪些之和,哪些就装的9g [quote=引用 5 楼 FancyMouse 的回复:] 339 416 456 476 487 493 496 498 499 500 现在有点空,稍微写了个程序马上跑出了这个解。当然我比较蠢,心算我是肯定算不出的。
我怎么感觉这个好简单。 从第一个瓶子里面取1粒, 第二个瓶子里面取2粒, 第三个瓶子里面取4粒, 。。。 第10个瓶子里面取256(2的9次方)粒, 这样称一次就好了。 结果很好分析啊。 (1+2+4+。。。+256)=511 设称出来的重量为X 则5110-X等于哪些之和,哪些就装的9g [quote=引用 5 楼 FancyMouse 的回复:] 339 416 456 476 487 493 496 498 499 500 现在有点空,稍微写了个程序马上跑出了这个解。当然我比较蠢,心算我是肯定算不出的。
2^(n-1)当然不是最优。比如n=4的时候你可以取{3,5,6,7}。你可以证明每一个子集的和都不同,但是最大元素比8小。 鉴于趋向无穷的时候已经证明最大元素0.221*2^n的时候依然有解,我有理由相信这题500是有解的。
33,027
社区成员
35,335
社区内容
加载中
试试用AI创作助手写篇文章吧