時間限制: 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。接下來...