動態規劃兩題(矩形巢狀 硬幣問題)P161 162

2021-07-02 19:53:36 字數 1291 閱讀 8244

矩形巢狀

有n個矩形,每個矩形可以用a,b來描述,表示長和寬。矩形x(a,b)可以巢狀在矩形y(c,d)中當且僅當a輸入

第一行是乙個正正數n(0輸出

每組測試資料都輸出乙個數,表示最多符合條件的矩形數目,每組輸出佔一行

樣例輸入

1

101 2

2 45 8

6 10

7 93 1

5 812 10

9 72 2

樣例輸出

5

這個是經典的dp問題,這裡注意分為兩個步驟來解決,將資料排序,得到乙個遞增的序列,第二步,將這個問題轉化為最長單調遞增子串行問題,通過上面的兩步,問題也就解決了

#include #include #include using namespace std;

struct ans;

struct ans a[1001];

int dp[1001];

bool cmp(struct ans a,struct ans b)

bool max(struct ans m,struct ans n)

int main()

} sort(a,a+m,cmp);

memset(dp,0,sizeof(dp));

for(i = 1; i < m; i++)

}} int max = dp[0];

for(i = 0; i < m; i++)

printf("%d\n",max+1);

} return 0;

}

硬幣問題(完全揹包)

有n種硬幣,面值為別為a[1],a[2],a[3]……a[n],每種都有無限多。給定非負整數s,可以選取多少個硬幣使得面值和恰好為s?輸出硬幣數目最小值和最大值

輸入:第一行 n  ——第二行 s ——  第3到n+2行  n種不同的面值(3 6 1 2 3)

輸出:第一行為最小值 第二行為最大值(2 6)

f[v]表示用v個硬幣裝滿s,f[v]=min(f[v-a[i]])+1,特別注意初始化……

#include using namespace std;

int da[10005],d[10005],a[105];

int main()

d[0]=da[0]=0;

for(j=0;j<=s;j++)

for(i=1;i<=n;i++)

if(j>=a[i])

cout<

動態規劃 矩形巢狀問題

矩形巢狀 時間限制 3000 ms 記憶體限制 65535 kb 難度 4 描述 有n個矩形,每個矩形可以用a,b來描述,表示長和寬。矩形x a,b 可以巢狀在矩形y c,d 中當且僅當a根據題意,首先可以想象的到,如果乙個矩形能鑲嵌另乙個矩形,那麼這個矩形的面積就一定比另乙個矩形的面積大了。所以,...

動態規劃 矩形巢狀

時間限制 3000 ms 記憶體限制 65535 kb 難度 4描述 有n個矩形,每個矩形可以用a,b來描述,表示長和寬。矩形x a,b 可以巢狀在矩形y c,d 中當且僅當a輸入 第一行是乙個正正數n 0輸出 每組測試資料都輸出乙個數,表示最多符合條件的矩形數目,每組輸出佔一行 樣例輸入 1 10...

動態規劃 矩形巢狀

時間限制 3000 ms 記憶體限制 65535 kb 難度 4 輸入第一行是乙個正正數n 0輸出 每組測試資料都輸出乙個數,表示最多符合條件的矩形數目,每組輸出佔一行 樣例輸入 1 101 2 2 45 8 6 10 7 93 1 5 812 10 9 72 2樣例輸出 5描述 有n個矩形,每個矩...