機器分配 dp

2021-09-13 02:04:50 字數 1778 閱讀 4266

時間限制: 1000 ms         記憶體限制: 65536 kb

提交數: 1693     通過數: 867

總公司擁有高效裝置m臺,準備分給下屬的n個分公司。各分公司若獲得這些裝置,可以為國家提供一定的盈利。問:如何分配這m臺裝置才能使國家得到的盈利最大?求出最大盈利值。其中m≤15,n≤10。分配原則:每個公司有權獲得任意數目的裝置,但總台數不超過裝置數m。

第一行有兩個數,第乙個數是分公司數n,第二個數是裝置台數m;

接下來是乙個n*m的矩陣,表明了第 i個公司分配 j臺機器的盈利。

第一行輸出最大盈利值;

接下n行,每行有2個數,即分公司編號和該分公司獲得裝置台數。

3 3           //3個分公司分3臺機器

30 40 50

20 30 50

20 25 30

70                                         //最大盈利值為70

1 1 //第一分公司分1臺

2 1 //第二分公司分1臺

3 1 //第三分公司分1臺

思路:

設dp[i][j]:=分配到第i個公司時,要分配j個機器的最高利潤。

然後內層搞個for迴圈,k從0到j表示前i-1個公司分配到的機器,那麼第i個公司分配到的機器數就是j-k

狀態轉移方程:

dp[i][j]=max(dp[i][j],dp[i-1][k]+v[i][j-k])

關鍵是怎麼輸出qwq,開乙個陣列cnt[i][j]表示給前i個公司分配j臺裝置,第i個公司實際分了cnt[i][j]臺,那麼給前i-1個公司分配的設配就是j-cnt[i][j],那麼第i-1個公司分到的裝置就是cnt[i-1][j-cnt[i][j]]

然後遞迴輸出就好了

(dp小白哭泣)

**如下:

#include#include#include#include#include#include#include#include#include#includeusing namespace std;

#define ll long long

#define lson l,m,rt<<1

#define rson m+1,r,rt<<1|1

#define ull unsigned long long

typedef pairp;

const int inf=0x3f3f3f3f;

const int n=20,mod=32767;

int v[n][n],dp[n][n],cnt[n][n];//給前i個公司分配j臺裝置,第i個公司實際分了k臺

void f(int x,int y)

else

}int main()

}int tmp;

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

}//printf("dp[%d][%d]=%d\n",i,j,dp[i][j]);}}

printf("%d\n",dp[n][m]);

f(n,m);}/*

3 330 40 50

20 30 50

20 25 30

*/

DP 機器分配

總公司擁有高效生產裝置m臺,準備分給下屬的n個公司。各分公司若獲得這些裝置,可以為國家提供一定的盈利。問 如何分配這m臺裝置才能使國家得到的盈利最大?求出最大盈利值。其中m 15,n 10。分配原則 每個公司有權獲得任意數目的裝置,但總台數不得超過總裝置數m。第一行儲存兩個數,第乙個數是裝置台數m,...

機器分配 DP

題目 總公司擁有高效生產裝置m臺,準備分給下屬的n個公司。各分公司若獲得這些裝置,可以為國家提供一定的盈利。問 如何分配這m臺裝置才能使國家得到的盈利最大?求出最大盈利值。其中m 15,n 10。分配原則 每個公司有權獲得任意數目的裝置,但總台數不得超過總裝置數m。輸入 第一行儲存兩個數,第乙個數是...

線性DP 機器分配

某總公司擁有高效生產裝置m臺,準備分給下屬的n個分公司。各分公司若獲得這些裝置,可以為總公司提供一定的盈利。問 如何分配這m臺裝置才能使國家得到的盈利最大?求出最大盈利值。分配原則 每個公司有權獲得任意數目的裝置,但總台數不得超過總裝置數m。其中m 100,n 100。第一行為兩個整數m,n。接下來...