POJ1252 完全背包 dp 搜尋 dfs bfs

來源:互聯網
上載者:User

今天見到一道不錯的水題,但是卡了我兩次,是道完全背包,也可以用搜尋,因為剛剛開始練習背包,可謂入門,感覺這是道不錯的題,就用dp小試一下。

串連:http://poj.org/problem?id=1252

題目大意:給6種不同面額硬幣,求組成[1,100]中數的平均需要硬幣與最多需要硬幣數,可以通過減法獲得,比如有1、4兩種硬幣,湊成3可以用4-1兩個硬幣完成,而不是1+1+1三個硬幣。


乍一看,很水的題,DP做得話要注意兩點:

一:題目不僅僅有+的操作,也有哦-的操作,所以需要正向和反向各dp一遍才行。。

二:題目dp不能只開到100.。而是要開大點,到2000足以。。因為我們假設。。存在1、95、96、97、98、99這樣又大又互質的資料。。那麼算的話會算到很大的數,所以需要多開。。2000就夠。。網上大牛說的。。。



以下是俺用dp做AC的代碼:

#include <iostream>#include <cstring>using namespace std;#define inf(0x7f7f7f7f)#define min(a,b)((a)<(b)?(a):(b))int main(){int t;scanf("%d", &t);while (t--){int value[6];int i;for (i=0; i<6; i++)scanf("%d", &value[i]);int max = 0, sum = 0;int dp[2101];memset(dp, inf, sizeof(dp));dp[0] = 0;for (i=0; i<6; i++)for (int j=value[i]; j<=2000; j++)dp[j] = min(dp[j], dp[j-value[i]] + 1);for (i=0; i<6; i++)for (int j=2000; j>=0; j--)dp[j] = min(dp[j], dp[j+value[i]] + 1);for (i=1; i<=100; i++){sum += dp[i];if (dp[i] > max)max = dp[i];}printf("%.2lf %d\n", sum/100.0, max);}return 0;}

深搜的話就沒什麼好說的,也沒什麼最佳化技巧,類似純暴力,可以。。居然比和dp速度差不多。。我那個囧啊~~

一開始step上限敲到2000.。果斷逾時。。。後來發現。。肯定用不了那麼多。。於是果斷改到1000、500、100、50、30.。。。。。最後發現。。30通過無壓力啊。。

dfs代碼:

#include <iostream>#include <cstring>using namespace std;#define inf(0x7f7f7f7f)int num[2100];int value[6];void dfs(int x, int step){if (step > 30 || x > 2000)return ;int i;for (i=0; i<6; i++){if (step+1 < num[x+value[i]]){num[x+value[i]] = step+1;dfs(x+value[i], step+1);}if (x >= value[i]){if (step+1 < num[x-value[i]]){num[x-value[i]] = step+1;dfs(x-value[i], step+1);}}}}int main(){int t;scanf("%d", &t);while (t--){int i;memset(num, inf, sizeof(num));for (i=0; i<6; i++){scanf("%d", &value[i]);}num[0] = 0;dfs(0, 0);int sum = 0, max = 0;for (i=0; i<=100; i++){sum += num[i];if (num[i] > max)max = num[i];}printf("%.2lf %d\n", sum/100.0, max);}return 0;}

測試資料:

input


4
1 2 5 10 20 50
1 24 34 39 46 50
1 2 3 7 19 72
1 95 96 97 98 99


output


2.96 5
2.52 3
2.80 4
12.29 25


聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.