1. 程式人生 > >NOI 1775:採藥(C++) 動態規劃

NOI 1775:採藥(C++) 動態規劃

典型的01揹包,動態規劃問題

雖然AC了,但是還有有點不明白,為什麼要加不選擇物體的for迴圈(初步的想法是,有可能條件不滿足調價物體,但是不應該是0,最少應該是【i-1】【j】的值)

參考:

 http://qkxue.net/info/130583/OpenJudge-2-6-1775

#include "iostream"
using namespace std;
int result[101][1001];//maxP[i][j]表示前i個物體裝到剩餘體積為j的揹包裡能達到的最大價值
int main()
{
    int T,M;//總時間上限,草藥個數
    cin>>T>>M;
    for(int i=1;i<=M;i++)
    {
        int perT,perP;//某種草藥採摘歲需要的時間和價值
        cin>>perT>>perP;
        for(int j=0;j<=T;j++)//不選擇物體
        {
            result[i][j] = result[i-1][j];
        }
        for(int j=0;j<=T;j++)//選擇物體
        {
            if(j+perT<=T)
                result[i][j+perT] = max(result[i-1][j+perT],result[i-1][j]+perP);
            //舉例子:寶石
            //從d(2, 7)到d(3, 10)就隔了1個寶石。 它有兩種情況,裝或者不裝入揹包。
            // 如果裝入,在面對前2個寶石時, 揹包就只剩下體積7來裝它們,而相應的要加上2號寶石的價值12, d(3, 10)=d(2, 10-3)+12=d(2, 7)+12;
            // 如果不裝入,體積仍為10,價值自然不變了, d(3, 10)=d(2, 10)。記住,d(3, 10)表示的是前3個寶石裝入到剩餘體積為10 的揹包裡能達到的最大價值,
            // 既然是最大價值,就有d(3, 10)=max{ d(2, 10), d(2, 7)+12 }。
        }
    }
    cout<<result[M][T]<<endl;
    return 0;
}


相關推薦

NOI 1775:採藥(C++) 動態規劃

典型的01揹包,動態規劃問題 雖然AC了,但是還有有點不明白,為什麼要加不選擇物體的for迴圈(初步的想法是,有可能條件不滿足調價物體,但是不應該是0,最少應該是【i-1】【j】的值) 參考:  http://qkxue.net/info/130583/OpenJudge-

[C++] 動態規劃之矩陣連乘、最長公共子序列、最大子段和、最長單調遞增子序列

每次 種子 () return 避免 amp 可能 text com 一、動態規劃的基本思想   動態規劃算法通常用於求解具有某種最優性質的問題。在這類問題中,可能會有許多可行解。每一個解都對應於一個值,我們希望找到具有最優值的解。   將待求解問題分解成若幹個子問題,先求

C++ 動態規劃 01揹包+ 最大字陣列和 +最短路徑 +斐波那契數列

int max(int a,int b) { return a>b?a:b; } /* 0 1 揹包 */ int MaxValue() { int Weight[5]={2,2,6,5,4};//物品的重量陣列 int Value

C++ -動態規劃

1、鋼材切割 程式碼1思路: 將鋼材切割問題優化為: 鋼材長度n<=10    鋼材長度n>10 對於n<=10,可以遍歷迭代解決;對於n>10,可以分段切割,每次切割i=1,2,。。。10十種情況; 此法有個缺點,n較大時迭代時間長

C++動態規劃演算法之Maximum sum(最大和)

Maximum sum(最大和) Description Given a set of n integers: A={a1, a2,..., an}, we define a function d

C++動態規劃及單調佇列的優化————擁擠的奶牛(擠奶牛Crowded Cows)和彈簧高蹺(POGO的牛Pogo-Cow)

題目描述: FJ的n頭奶牛(1<=n<=50000)在被放養在一維的牧場。第i頭奶牛站在位置x(i),並且x(i)處有一個高度值h(i)(1<=x(i),h(i)<=1000000000)。 一頭奶牛感覺到擁擠當且僅當它的左右兩端都有一頭奶牛所在的高度至少是它的2倍,

c++動態規劃——揹包問題

問題基礎:有N件物品和一個容量為C的揹包。第i件物品的體積是W[i],價值是V[i]。求解將哪些物品裝入揹包可使這些物品的重量總和不超過揹包容量,且價值總和最大。 怎樣才能得到放入書包物品的的最大價值呢? 解決方法——【動態規劃】 運籌學的分支,糾結決策過程最優化的數學方法

Problem C: 動態規劃基礎題目之數字三角形

Your program is to read from standard input. The first line contains one integer N: the number of rows in the triangle. The following N lines describe the

c++ 動態規劃(數塔)

c++ 動態規劃(dp) 題目描述 觀察下面的數塔。寫一個程式查詢從最高點到底部任意位置結束的路徑,使路徑經過數字的和最大。 每一步可以從當前點走到左下角的點,也可以到達右下角的點。 輸入 5 13 11 8 12 7 26 6 14 15 8 12 7 13 24 11 輸出 86 AC程式碼 #incl

動態規劃之01背包問題(含代碼C)

bsp sys 最優解 ret 時間復雜度 維數 style 時間 沒有 1.動態規劃的基本思想   動態規劃算法通常用於求解具有某種最優性質的問題。其基本思想也是將待求解問題分解成若幹個子問題,先求解子問題,然後從這些子問題的解得到原問題的解。與分治法不同的是,適合於用動

動態規劃】 Codeforces Round #416 (Div. 2) C. Vladik and Memorable Trip

and main spa def esp 動態 return 價值 can 劃分那個序列,沒必要完全覆蓋原序列。對於劃分出來的每個序列,對於某個值v,要麽全都在該序列,要麽全都不在該序列。 一個序列的價值是所有不同的值的異或和。整個的價值是所有劃分出來的序列的價值之和。

動態規劃】Codeforces Round #406 (Div. 2) C.Berzerk

[1] space node sca 一個 for 隊列 ber 動態規劃 有向圖博弈問題。 能轉移到一個必敗態的就是必勝態。 能轉移到的全是必勝態的就是必敗態。 轉移的時候可以用隊列維護。 可以看這個 http://www.cnblogs.com/quintessence

C++求解漢字字符串的最長公共子序列 動態規劃

esp style mes else if c++ char 那種 size 公共子序列 近期,我在網上看了一些動態規劃求字符串最長公共子序列的代碼。可是無一例外都是處理英文字符串,當處理漢字字符串時。常常會出現亂碼或者不對的情況。 我對代碼進行了改動。使用wc

BZOJ NOI 1999 釘子和小球 動態規劃+分數類

getc namespace += tchar std 有趣的 題目 小數 content 題目大意:不太好描寫敘述,自己看吧。。 思路:首先從最上面的點開始考慮。由於球一定是從最上面開始往下掉,所以球經過最上面的點的概率是1,然後他會有1/2的幾率向左,

NOI題庫 / 2.6基本算法之動態規劃 - 8471:切割回文

多少 ++i turn aac als return 得到 什麽 包含 總時間限制: 1000ms 內存限制: 65536kB描述 阿福最近對回文串產生了非常濃厚的興趣。 如果一個字符串從左往右看和從右往左看完全相同的話,那麽就認為這個串是一個回文串。例如,“abcaacb

多線程動態規劃算法求解TSP(Traveling Salesman Problem) 並附C語言實現例程

影響 () 高效率 let ever 好的 出現 我們 運算 TSP問題描述:   旅行商問題,即TSP問題(Travelling Salesman Problem)又譯為旅行推銷員問題、貨郎擔問題,是數學領域中著名問題之一。假設有一個旅行商人要拜訪n個城市,他必須選擇所

【BZOJ2436】NOI嘉年華(動態規劃

pri spa 單調性 return uniq () num 其中 print 【BZOJ2436】NOI嘉年華(動態規劃) 題面 BZOJ 題解 考慮第一問如何求解 發現狀態與選擇了哪些活動無關,只與時間有關 設\(f[i][j]\)表示前\(i\)個單位時間(離散後),

採藥-動態規劃(01揹包)

採用一維陣列進行優化 #include<cstdio> #include<algorithm> using namespace std; int w[105], v[105]; int dp[1005]; int main() { int m, n; sca

動態規劃C++

引入題目 給定陣列arr,arr中所有的值都為正數且不重複。每個值代表一種面值的貨幣,每種面值的貨幣可以使用任意張,再給定一個整數aim代表要找的錢數,求找錢有多少種方法。 分析:可以使用,暴力搜尋方法、記憶搜尋方法、動態規劃方法、狀態繼續簡化後的動態規劃方法。 暴力搜尋方法

C. Playing Piano 動態規劃

題目意思是給你一個n長度的數字串為a,讓你構造一個n長度的數字串b值都為1-5滿足以下條件:   正常的dfs暴力構造會超時,我試過了。。 可以開一個二維陣列dp[i][j]用來表示b的第i個數字為j是否可行,標記為1或0; 因為第i個數字的大小隻會影響第i+1個數字,每次確定i都根據第