1. 程式人生 > >CODE【VS】2144 砝碼稱重2(dfs+剪枝)

CODE【VS】2144 砝碼稱重2(dfs+剪枝)

題目描述 Description

有n個砝碼,現在要稱一個質量為m的物體,請問最少需要挑出幾個砝碼來稱?

注意一個砝碼最多隻能挑一次

輸入描述 Input Description

第一行兩個整數n和m,接下來n行每行一個整數表示每個砝碼的重量。

輸出描述 Output Description

輸出選擇的砝碼的總數k,你的程式必須使得k儘量的小。

樣例輸入 Sample Input

3 10
5
9
1

樣例輸出 Sample Output

2

資料範圍及提示 Data Size & Hint

1<=n<=30,1<=m<=2^31,1<=每個砝碼的質量<=2^30

題解:簡單搜尋,直接看程式碼吧!
#include<cstdio>
#include<algorithm>
using namespace std;
int n,m,a[31],ans;
long long hou[32];
bool cmp(int a,int b){return a>b;}
void dfs(int flag, int tot, int sum)
{
    if (tot>=ans) return;
    if (sum==m){ans=tot; return;}
    for (int i=flag; i<=n; i++)
        if (sum+a[i]<=m)
            if (sum+hou[i]<m) return;
            else dfs(i+1,tot+1,sum+a[i]);
}
int main()
{
    scanf("%d%d",&n,&m);
    for (int i=1; i<=n; i++)
        scanf("%d",&a[i]);
    sort(a+1,a+n+1,cmp);
    for (int i=n; i>=1; i--)
        hou[i]=hou[i+1]+a[i];
    ans=n;
    dfs(1,0,0);
    printf("%d\n",ans);
    return 0;
}


相關推薦

CODEVS2144 砝碼2dfs+剪枝

題目描述 Description 有n個砝碼,現在要稱一個質量為m的物體,請問最少需要挑出幾個砝碼來稱? 注意一個砝碼最多隻能挑一次 輸入描述 Input Description 第

2144 砝碼 2 用map離散化hasi+二分搜尋

2144 砝碼稱重 2  時間限制: 1 s  空間限制: 16000 KB  題目等級 : 鑽石 Diamond 題解 題目描述 Descrip

CODEVS 2144 砝碼2

//二分dfs,最後合併 #include<bits/stdc++.h> using namespace std; const int maxn = 400000; int n, m,

wikioi 2144 砝碼 2 STL_map

看似dp,但是資料太大,不過n很小,可以暴力解決。 由於30個數組合情況太多,所以可以分成兩邊,首先預處理前n/2個數能組成哪些數,並且最小消耗多少砝碼,map儲存下來。 然後處理右邊能組合成什麼數,相加就夠了。 注意這樣會漏掉兩種情況,就是光一邊就能組成最終答案的(因為m

CODEVS1384 黑色星期五計算某一天是星期幾的公式

題目描述 Description 13號又是星期五是一個不尋常的日子嗎? 13號在星期五比在其他日少嗎?為了回答這個問題,寫一個程式來計算在n年裡13 日落在星期一,星期二......星期日的次數.這個測試從1900年1月1日到 1900+n-1年12月31日.n是

wikioi-天梯-提高一等-雜湊表-2144砝碼2

題目描述 Description 有n個砝碼,現在要稱一個質量為m的物體,請問最少需要挑出幾個砝碼來稱? 注意一個砝碼最多隻能挑一次 輸入描述 Input Description 第一行兩個整數n和m,接下來n行每行一個整數表示每個砝碼的重量。

Wikioi 2144 砝碼

用到的技巧就是將它分成前n/2個和後n/2個砝碼 先計算出前n/2個砝碼可以稱出的重量和所用砝碼數量(暴力計算) 存在map中 處理後n/2個砝碼的時候就直接判斷m-當前重量是否可行並更新ans即可 #include<cstdio> #include<ma

javaweb請求轉發和定向面試經常問

重定向 //之前的寫法 response.setStatus(302); response.setHeader(“Location”, “login_success.html”); //重定向寫法: 重新定位方向 引數即跳轉的位置 response.sendRe

Codevs_P2144 砝碼 2

時間限制: 1 s 空間限制: 16000 KB 題目等級 : 鑽石 Diamond 題目描述 Description 有n個砝碼,現在要稱一個質量為m的物體,請問最少需要挑出幾個砝碼來稱? 注意一個砝碼最多隻能挑一次 輸入描述 Input De

砝碼2

題目描述 Description 有n個砝碼,現在要稱一個質量為m的物體,請問最少需要挑出幾個砝碼來稱? 注意一個砝碼最多隻能挑一次 輸入描述 Input Description 第一行兩個整數

NOI題庫--砝碼V2多重揹包2^n拆分

以前只會寫多重揹包的原版,渣的不行,為了做此題不得不學習了一下,發現其實也不難,只要理解了方法就好多了(PS:其實和倍增挺像的) 8756:砝碼稱重V2 總時間限制: 1000ms 記憶體限制:

Python正則表達式1未完

pes mmu get regular rop 則表達式 line out github 1、正則表達式唯一的用途就是在文本中匹配和尋找模式,模式可以簡單,也可以復雜。 2、Regexr 這個網站很個性的就是,有一個community標簽,打開後可以看到評分由高到低

洛谷P3374 模板樹狀數組 1CDQ分治

size 結果 pri amp fine open sum turn 二維 題目描述 如題,已知一個數列,你需要進行下面兩種操作: 1.將某一個數加上x 2.求出某區間每一個數的和 輸入輸出格式 輸入格式: 第一行包含兩個整數N、M,分別表示該數列數字的個

模板可持久化線段樹 1主席樹

base math 一次 數據 mar 指定 das min 第k小 題目背景 這是個非常經典的主席樹入門題——靜態區間第K小 數據已經過加強,請使用主席樹。同時請註意常數優化 題目描述 如題,給定N個正整數構成的序列,將對於指定的閉區間

UVaBiggest Numberdfs+剪枝

scanf sin ret break puts 從大到小 如果 ssl ges 題目 題目 ? ? 分析 典型搜索,考慮剪枝。 統計一下聯通分量。 1、本位置能夠達到所有的點的數量加上本已有的點,還沒有之前的結果長,直接返回。 2、當本位置能夠達到所有的點的數量加上本

MongoDBNoSQL Manager for MongoDB 教程基礎篇

好的 log 很難 gpo ssi next 破解 情況 eight 前段時間,學習了一下mongodb,在客戶端工具方面,個人認為 NoSQL Manager for MongoDB 是體驗比較好的一個,功能也較齊全。可惜在找教程的時候,發現很難找到比較詳細的

BZOJ1260 [CQOI2007]塗色paint區間dp

c++ ide hid event pri display pro == spl 題目 傳送門:QWQ 分析 區間dp, 詳見代碼 代碼 /*****************************************

刷題洛谷 P3834 模板可持久化線段樹 1主席樹

!= tchar 這樣的 信息 reg har mem hair define 題目背景 這是個非常經典的主席樹入門題——靜態區間第K小 數據已經過加強,請使用主席樹。同時請註意常數優化 題目描述 如題,給定N個正整數構成的序列,將對於指定的閉區間查詢其區間內的第K小值。

題解 bzoj1207: [HNOI2004]打鼴鼠 動態規劃

def math clas amp online code 直接 tro ID bzoj1207,懶得復制,戳我戳我 Solution: 挺傻逼的一個\(dp\),直接推就好了 這題在bzoj上的數據有點問題,題目保證每個時間點不會出現在同一位置兩個地鼠,然而他有= =(

P3834 模板可持久化線段樹 1主席樹

lose printf TE article 發現 AC 但是 || amp 題目背景 這是個非常經典的主席樹入門題——靜態區間第K小 數據已經過加強,請使用主席樹。同時請註意常數優化 題目描述 如題,給定N個正整數構成的序列,將對於