日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

AlvinZH双掉坑里了

發(fā)布時(shí)間:2023/12/1 编程问答 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 AlvinZH双掉坑里了 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

AlvinZH雙掉坑里了

時(shí)間限制: 1000 ms 內(nèi)存限制: 65536 kb

?

題目描述

AlvinZH雙掉進(jìn)坑里了!

幸運(yùn)的是,這坑竟然是寶藏迷宮的入口。這一次AlvinZH機(jī)智地帶了很多很多背包——裝金幣!

假設(shè)現(xiàn)在AlvinZH撿到了n塊金幣,他一共帶了m個(gè)背包,每個(gè)背包可以裝任意多金幣,但AlvinZH不允許有空的背包。

請(qǐng)你幫他計(jì)算一下一共有多少種裝金幣的方法吧!

注意:所有背包看作相同,即{1,3}和{3,1}是同一種方法。

輸入

輸入包含多組數(shù)據(jù)。

每組數(shù)據(jù)包含兩個(gè)正整數(shù),為金幣數(shù)n(1≤n≤10^4),背包數(shù)m(1≤m≤10^3,且m≤n)。

輸出

對(duì)于每組數(shù)據(jù),輸出一行,為使用所有背包裝金幣的方法數(shù)(結(jié)果對(duì)1000007取模)。

輸入樣例

4 2 9 3

輸出樣例

2 7

樣例解釋

4:{1,3}{2,2};

9:{1,1,7}{1,2,6}{1,3,5}{1,4,4}{2,2,5}{2,3,4}{3,3,3}。

HINT

這不是簡(jiǎn)單的背包問(wèn)題,請(qǐng)勿套公式。

AlvinZH:其實(shí)和背包沒(méi)有任何關(guān)系~

思路

?

簡(jiǎn)單DP。簡(jiǎn)化問(wèn)題:將n個(gè)金幣放入m個(gè)盒子,無(wú)空盒。直接上dp吧,dp[i][j]:將i個(gè)金幣放入j個(gè)盒子的方法數(shù)。此題的關(guān)鍵在于如何找到狀態(tài)轉(zhuǎn)移方程,很有可能會(huì)計(jì)算重復(fù)的方法。我們把答案分成兩部分:①放完之后所有盒子金幣數(shù)量大于1; ②放完之后至少有一個(gè)盒子金幣數(shù)量為1。 這樣分可以保證不會(huì)有重復(fù)計(jì)算。狀態(tài)轉(zhuǎn)移方程: dp[i][j]=dp[i?j][j]+dp[i?1][j?1]。① dp[i?j][j] :將(i-j)個(gè)金幣放到j(luò)個(gè)盒子,然后這j個(gè)盒子每個(gè)再放1個(gè)金幣。表示的是將i個(gè)金幣分成所有盒子金幣數(shù)量大于1的方案總數(shù)。例如,求9分解成3份,69-3)分成3份可以分為{1,1,4}{1,2,3}{2,2,2},則9可以分為{2,2,5}{2,3,4}{3,3,3},共3種。② dp[i?1][j?1]:將(i-1)個(gè)金幣放到(j-1)個(gè)盒子,再來(lái)一個(gè)盒子放1個(gè)。表示的是將i個(gè)金幣分成至少有一個(gè)盒子金幣數(shù)量為1的方案總數(shù)。例如,求9分解成3份,89-1)分成2份可以分為{1,7}{2,6}{3,5}{4,4},則9可以分為{1,1,7}{1,2,6}{1,3,5}{1,4,4},共4種。難點(diǎn)在于如何避免重復(fù),這里處理得十分巧妙,請(qǐng)細(xì)細(xì)體會(huì)。

?

以上轉(zhuǎn)自https://www.cnblogs.com/AlvinZH/p/7840604.html#_label3

之所以將答案分為1,2兩種情況,是由于1,2兩種情況可以把原問(wèn)題分為兩個(gè)不相交的集合,且每個(gè)子集的答案都可以以一種方式從規(guī)模更小的問(wèn)題中生成。

放完后所有盒子金幣數(shù)大于1:假設(shè)”將i個(gè)金幣放入j個(gè)盒子且所有盒子金幣數(shù)大于1“的放法有k種,那么我從每個(gè)盒子拿去一個(gè)金幣,一定對(duì)應(yīng)子問(wèn)題dp[i-j][j]的一種放法,即兩者的放法數(shù)是相等的。

每個(gè)dp[i-j][j]的一種放法,各加一個(gè)金幣都可以生成現(xiàn)有問(wèn)題的一個(gè)放法;而現(xiàn)有問(wèn)題的放法各拿去一個(gè)金幣又可以生成子問(wèn)題dp[i-j][j]的一種放法,二者一一對(duì)應(yīng)。

放完后至少有一個(gè)盒子金幣數(shù)量為1:假設(shè)”將i個(gè)金幣放入j個(gè)盒子且至少有一個(gè)盒子金幣數(shù)量為1“的放法有k種,那我拿去這個(gè)盒子和這個(gè)球,一定對(duì)應(yīng)子問(wèn)題dp[i-1][j-1]的一種放法,即二者放法數(shù)是相等的。

?另外關(guān)于初始值,將某個(gè)非法子問(wèn)題的dp值置0來(lái)使得其貢獻(xiàn)為0

i>=j才能保證沒(méi)有空包,只對(duì)i>=j問(wèn)題求解,否則保持初始值0,表示該情況不能生成更規(guī)模問(wèn)題的解(貢獻(xiàn)為0)。

?另外i,j>=1的才是問(wèn)題討論的范圍,因此循環(huán)i,j從1開(kāi)始,且將dp[i][0],dp[0][j]也置0

但注意dp[0][0]要初始化為1(但感覺(jué)上應(yīng)該是初始化do[1][1]=1,只不過(guò)初始化dp[0][0]=1碰巧能通過(guò)轉(zhuǎn)移方程求出dp[1][1]=1且這樣能保持循環(huán)的美觀,也可以直接初始化dp[1][1]但此時(shí)循環(huán)中i=1,j=1的情況就要跳過(guò),否則又會(huì)被重新寫(xiě)為0)

參考代碼

1 // 2 // Created by AlvinZH on 2017/10/23. 3 // Copyright (c) AlvinZH. All rights reserved. 4 // 5 6 #include <cstdio> 7 #include <cstring> 8 #define MOD 1000007 9 10 int n, m; 11 int dp[10005][1005]; 12 13 int main() 14 { 15 while(~scanf("%d %d", &n, &m)) 16 { 17 memset(dp, 0, sizeof(dp)); 18 dp[0][0] = 1; 19 for (int i = 1; i <= n; ++i) { 20 for (int j = 1; j <= m; ++j) { 21 if(i - j >= 0) 22 dp[i][j] = (dp[i-j][j] + dp[i-1][j-1]) % MOD; 23 } 24 } 25 26 printf("%d\n", dp[n][m]); 27 } 28 }

?

轉(zhuǎn)載于:https://www.cnblogs.com/loganlzj/p/10134287.html

總結(jié)

以上是生活随笔為你收集整理的AlvinZH双掉坑里了的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。