zoukankan      html  css  js  c++  java
  • 【codevs2144】砝码称重 2

    problem

    solution

    codes

    //Meet in the Middle
    #include<iostream>
    #include<algorithm>
    #include<map>
    using namespace std;
    int n, mass, ans(666), f[233];
    map<int, int>ma; //能称出的质量->需要的砝码
    //k:当前用的砝码个数,cur:从哪个砝码开始选,sum:当前称出的质量
    void dfs1(int k, int cur, int sum){
        if(sum>mass || cur>n/2)return ;
        ma[sum] = k;
        dfs1(k+1,cur+1,sum+f[cur]);//选当前砝码
        dfs1(k,cur+1,sum);//不选当前砝码
    }
    void dfs2(int k, int cur, int sum){
        if(sum>mass || cur>n)return ;
        if(ma.find(mass-sum) != ma.end()){//如果能跟前半段的结果组成目标质量
            ans = min(ans,k+ma[mass-sum]);//更新答案
            return;
        }
        dfs2(k+1,cur+1,sum+f[cur]);
        dfs2(k,cur+1,sum);
    }
    int main(){
        cin>>n>>mass;
        for(int i = 0; i < n; i++)
            cin>>f[i];
        dfs1(0,0,0);//先搜前半段
        dfs2(0,n/2,0);//再搜后半段
        cout<<ans<<"
    ";
        return 0;
    }
  • 相关阅读:
    Jsp补充
    Jsp和Servlet关系
    ServletContext简介
    利用Session实现三天免登陆
    Cookie简介
    JSP简介
    线程基础--同步机制
    深思——工作面试
    response.setcontenttype的參数
    Codeforces 96D Volleyball spfa
  • 原文地址:https://www.cnblogs.com/gwj1314/p/9444701.html
Copyright © 2011-2022 走看看