欢迎访问刘师衡器维修、采购网!

砝码称重问题枚举法

佚名 分享 时间: 电子地磅 皮带秤 防爆秤

全国地磅电子秤销售、维修电话158-8101-1465

全国发货,地磅秤、电子秤,有需要的朋友可以直接联系上面电话哦,微同号
推荐度:
刘师傅老技术员

C语言中的砝码称重问题


1、以f(k):几种砝码组合能称出k的重量为状态DP全部n个砝码,然后枚举去掉的m个砝码的组合,对每种组合再DP一次,从f中减小刘师傅掉,剩下的就是能称出的不同重量,复杂度O(n * C(n, m) * m  * max(a))≤38760000。



2、例程:

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<memory.h>
/*a数组用于存储从n个整型数
 * 据中取k个数字的数组下标值
 * */
int a[训创存可种刻末100]={0};
素导季征/*data数组用于存储实际用差具的数据,也就是所有砝码的
 * 重量
 * */
 int data={2,2,3,3};
 /*sum数组用于保存再data中取k个树的和,注意
  * 没有唯一化处理,也就是说可能里面宁望己念除怎消热连这存在重复
  * 唯一化处理初志使用函数unique;
  * */
 int sum[100] = {0};
 /*index_sum用于记录sum中最后一个数据的索引值
  * *宽故止也四/
 int index_sum = 0;
 /*这是一个递归实现,用于获取从[start,length-num]的
  * 某一位数,这个位数对应了data数组的下标,num是从
  * data中取几位数的,fujia是一个附加参数,用于记录当
  * 前获取了几位树,从而方便操作数组a
  * */
void GetNumberNew(int start, int length, int num, int fuj乱提轻ia);
/*统计长度使于答为length的s欢朝帝茶四走带屋um数组中不重复元素的个
 * */
int unique(int[], int length);
int main()
{
   //data数组长度
    int length = 4;
    
    for(int y = 1; y <= length; y++)
    {
        /*从[0,num]中获取y个数*/
        GetNumberNew(0, length, y, y);
    }
   
    printf("%d",器然unique(sum, index_sum));
   
    return 0;
}
void GetNumberNew(int s意三板汽tart, int length, int num, int fujia)
{
        for(int i = start; i <= le待皮齐原兴客期质五火ngth - num; i++)
        {
            if (num > 0)
            {
            a[num - 1] = i;
            /*从[i+1,length]中获取种友num-1数
             * */
            G时娘父复etNumberNew(i +1, length, num-1, fujia);
            }
            else
            {
               for(int x = 0; x < fujia; x++)
               {
                    sum[index_sum] += data[a[x]]; 
                }
                index_sum++;
                return;
                }
            }
}
int unique(int sum[], int length)
{
    int temp = index_sum;
   // printf("temp:%d ",temp);
        f名故神战态千个or(int i = 0 ; i < length - 1; i++)
        {
                for(int j = i + 1; j < length某乙酸找送; j++)
                {
                        if(sum[i] == sum[j])
                        {
                            /*若有相同的数字则减1,并退出此次循环*/
                            temp--;
                            break;
                            }
                }
        }
        return temp;
}

12球称重问题 有十二个乒乓球特征相同,其中只有一个重量异常...
把12个球分成4 4 4 以下分别称为A,B,C组。先选择任意2组称之(以下设定为A,B组称)以下有2种情况会出现。Ⅰ:A,B 两组重量相等:那么取另外一组(C组)之中的2个称之:1:C1=C2 则代表异常害席急下继官双画现露把球在C3,C4中,再拿任意一正常球与C3或C4称之,相同则另一球为异常球,不同则本身为异常球;2:C1≠C2 则代表异常球在C1,C2中,再拿任意一正常球与C1或C2称之,相同则另一球为异常球,不同则本身为异常球。Ⅱ:A,B两组重量不相等: 又分3种情况: 1: A123+B1<A4+C123 2: A123+B1>A4+C123 3: A123+B1=A4+C123 1 异常的一定是 A123其中之一,益坐火久罗今察水色弱胞而且是轻的 那就把 A1与A2称 ,相等则A3为异常球 不等则轻的等调角首蛋九地为异常球;2 异常的一定是B1或A4 那就找个好的和其混冷中一个称一下就行了;3 异常的一定是B2,B3,B4其中一个,而且还是重的,再拿B2与B3称,相等,B4为考际护洋听且异常球,否则重的为异常球。
NOIP1996砝码称重问题c语言详解 要枚举法 要快
#include<iostream>
using namespace std;
int i,a1,a2,a3,a5,a10,a20,b1,b2,b3,b5,b10,b20,h=0;
bool b[1001];
int main()
{
cin>>a1>>a2>>a3>>a5>>a10>>a20;
for (i=0;i<1001;++i) b[i]=false;
for (b1=0;b1<=a1;++b1)
for (b2=0;b2<=a2;++b2)
for (b3=0;b3<=a3;++b3)
for (b5=0;b5<=a5;++b5)
for (b10=0;b10<=a10;++b10)
for (b20=0;b20<=a20;++b20)
b[b1+b2*2+b3*3+b5*5+b10*10+b20*20]=true;
for (i=1;i<1001;++i) if (b[i]==true) ++h;
cout<<h;
return 0;
}
C语言中的砝码称重问题

1、以f(k):几种砝码组合能称出k的重量为状态DP全部n个砝码,然后枚举去掉的m个砝码的组合,对每种组合再DP一次,从f中减掉,剩下的就是能称出的不同重量,复杂度O(n * C(n, m) * m  * max(a))≤38760000。



2、例程:
#include#include #include #include /*a数组用于存储从n个整型数 * 据中取k个数字的数组下标值 * */ int a[100]={0}; /*data数组用于存储实际的数据,也就是所有砝码的 * 重量 * */ int data={2,2,3,3}; /*sum数组用于保存再data中取k个树的和,注意 * 没有唯一化处理,也就是说可能里面存在重复 * 唯一化处理使用函数unique; * */ int sum[100] = {0}; /*index_sum用于记录sum中最后一个数据的索引值 * */ int index_sum = 0; /*这是一个递归实现,用于获取从[start,length-num]的 * 某一位数,这个位数对应了data数组的下标,num是从 * data中取几位数的,fujia是一个附加参数,用于记录当 * 前获取了几位树,从而方便操作数组a * */ void GetNumberNew(int start, int length, int num, int fujia); /*统计长度为length的sum数组中不重复元素的个数 * */ int unique(int[], int length); int main() { //data数组长度 int length = 4; for(int y = 1; y <= length; y++) { /*从[0,num]中获取y个数*/ GetNumberNew(0, length, y, y); } printf("%d",unique(sum, index_sum)); return 0; } void GetNumberNew(int start, int length, int num, int fujia) { for(int i = start; i <= length - num; i++) { if (num > 0) { a[num - 1] = i; /*从[i+1,length]中获取num-1数 * */ GetNumberNew(i +1, length, num-1, fujia); } else { for(int x = 0; x < fujia; x++) { sum[index_sum] += data[a[x]]; } index_sum++; return; } } } int unique(int sum[], int length) { int temp = index_sum; // printf("temp:%d ",temp); for(int i = 0 ; i < length - 1; i++) { for(int j = i + 1; j < length; j++) { if(sum[i] == sum[j]) { /*若有相同的数字则减1,并退出此次循环*/ temp--; break; } } } return temp; }
221381