1. 程式人生 > >HDU - 1712 - ACboy needs your help 【分組背包】

HDU - 1712 - ACboy needs your help 【分組背包】

分析 div pri test arr 背包 spa pac tro

<題目鏈接>

題目大意:
有n個課程,現在花M天來學習這些課程,學習每個課程花的天數所得到的價值不同,求M天怎麽分配學習才能得到的價值最大。(這些課程得到的價值和所花天數的關系由矩陣給出)

解題分析:
這是一個很明顯的分組背包問題,將某一門課程花m個不同天數能夠得到不同的價值看成是m個有各自花費和價值的物品,然後,又因為根據題意,每一門課程都只能選擇一種花費的天數,於是,這道題就被很自然的轉化為分組背包問題。

#include <iostream>
#include <algorithm>
#include <cstdio>
#include 
<cstring> using namespace std; int main() { int n, m; while (scanf("%d %d", &n, &m) != EOF,n||m) { int arr[110][110],c[110][110]; for (int i = 1; i <= n; i++) { for (int j = 1; j <= m; j++) { scanf("%d", &arr[i][j]); c[i][j]
= j; //記錄要花費的天數( 即背包中的體積 ) } } int dp[110]; memset(dp, 0, sizeof(dp)); for (int k = 1; k <= n; k++) //第k門課程 (對應分組背包中的組序號) { for (int v = m; v >= 0; v--) //總共所花的天數 (對應背包的容量)由於此題每組物品只能取一次,所以逆序 {
for (int i = 1; i <= m; i++) //第k門課中序號為i的物品 { if (v - i < 0)continue; dp[v] = max(dp[v], dp[v - c[k][i]] + arr[k][i]); } } } //dp[i][j]為,前i組中花費天數為v時,所能得到的最大價值 printf("%d\n", dp[m]); } return 0; }

2018-07-27

HDU - 1712 - ACboy needs your help 【分組背包】