紀念品題解

2021-10-02 01:14:51 字數 1648 閱讀 6276

1.題目中有一句話

每天賣出紀念品換回的金幣可以立即用於購買紀念品,當日購買的紀念品也可以當日賣出換回金幣。當然,一直持有紀念品也是可以的。

看上去是乙個句廢話,其實在提示我們,乙個物品可以以金幣的形式存在我們的口袋裡,也可以以物品的形式存在我們的口袋裡。那麼我們為了方便程式設計用金幣的形式儲存物品是比較方便的。

2.題目最終要求的是最大的金幣數量。所以每一天結束後的持有金幣數量+持有物品價值最大,才能獲得最後的最大呢?」。具體的我們可以從轉移方程中看出來。

3.寫出dfs函式

dfs(int day, int j, int money)
day: 第day天

j:第j個物品

money:手上剩餘的錢數

return:在第day的第j~n個物品上,我還剩money元,我瞎買物品(可能不買),那麼第二天能換回的最大金幣數量是多少?

那麼dfs的轉移關係就出來了

dfs(int day, int j, int money) = 

max(a[day+1][j]*c + dfs(day, j+1, money-a[day][j]*c));

c:買多少個

a[day+1][j]:第二天的物品j的**

money-a[day][j]*c: 因為買了c個物品,所以錢數變少了

附上dfs函式**

int dfs(int day, int j, int money)

if(dp[j][money] != 0)

for(int c = 0; c <= 99999; c++)

else

}return dp[j][money] = ans;

}

因為這只是求第day天的**,如果求一共t天的最大錢數,就要不停的呼叫dfs函式

up(day, 1, t-1)

#include#define up(i,x,y) for(int i=x; i<=y; i++)

using namespace std;

int b[100] = ;

int a[101][101] = ;

int t,n,m;

int ans = 0;

int dp[101][10001]=;

int maxprice[101] = ;

int minprice[101] = ;

int book[101][100000];

int dfs(int day, int j, int money)

if(dp[j][money] != 0)

for(int c = 0; c <= 99999; c++)

else

}return dp[j][money] = ans;

}int main()

} int money = m;

up(day, 1, t-1)

cout

}

紀念品分組

問題描述 元旦快到了,校學生會讓樂樂負責新年晚會的紀念品發放工作。為使得參加晚會的同學所獲得的紀念品價值 相對均衡,他要把購來的紀念品根據 進行分組,但每組最多只能包括兩件紀念品,並且每組紀念品的 之和不能超過乙個給定的整數。為了保證在盡量短的時 間內發完所有紀念品,樂樂希望分組的數目最少。你的任務...

紀念品分組

time limit 1 sec memory limit 128 mb submit 4 solved 2 submit status web board 元旦快到了,校學生會讓樂樂負責新年晚會的紀念品發放工作。為使得參加晚會的同學所獲得 的紀念品價值相對均衡,他要把購來的紀念品根據 進行分組,但...

紀念品分組

題目描述 元旦快到了,校學生會讓樂樂負責新年晚會的紀念品發放工作。為使得參加晚會的同學所獲得 的紀念品價值相對均衡,他要把購來的紀念品根據 進行分組,但每組最多只能包括兩件紀念品,並且每組紀念品的 之和不能超過乙個給定的整數。為了保證在盡量短的時間內發完所有紀念品,樂樂希望分組的數目最少。你的任務是...