nkoi P3793 禮物和糖果

2021-07-23 09:29:58 字數 1440 閱讀 7312

何老闆要給大家買節日禮物,他有m元錢,學校小賣部有n種禮品,因為店長和何老闆是熟人,所以若第i種禮品買x(x>0)件的話,店長會給何老闆ai*x+bi顆糖果。因為何老闆非常喜歡吃糖,所以他希望獲得的糖果越多越好。現給出每種禮品的單價wi、ai值與bi值,問何老闆最多能得到多少顆糖果?

輸入格式

第一行,兩個空格間隔的整數m和n

接下來n行,每行三個整數wi, ai 和 bi,描述一種禮物的情況。

輸出格式

一行,乙個整數,表示何老闆能得到的最大糖果數

樣例輸入

100 2

10 2 1

20 1 1

樣例輸出

21 提示

樣例說明,何老闆買了10個1號禮物,獲得 2 × 10 + 1 = 21顆糖

1 ≤ m ≤ 2000

1 ≤ n ≤ 1000

0 ≤ ai, bi ≤ 2000

1 ≤ wi ≤ 2000

** 2015 multi-university training

**

#include

#include

using

namespace

std;

const

int maxn=1005;

int m,n,tot;

int v[maxn],a[maxn],b[maxn],f[2005];

inline

void _read(int &tt)

for(tt=0;48

<=t&&t<=57;t=getchar())tt=(tt<<3)+(tt<<1)+t-48;

if(mark)tt=-tt;

} int main()

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

printf("%d",f[m]);

}

這道題採用了分情況的揹包問題,因為我們發現bi是與次數無關的,無論買多少個只會使用一次bi。所以我們把乙個帶ai和bi的情況分成了兩種策略,乙個是權值為ai+bi的,只能買一次;另一種是權值為ai的,但可以買無限次。於是就分成了乙個01揹包和乙個完全揹包的混合揹包問題(01揹包是逆序,完全揹包是順序)。

其中有乙個需要注意的是:

for(j=m;j>=v[i];j–) f[j]=max(f[j],f[j-v[i]]+a[i]+b[i]);

for(j=v[i];j<=m;j++) f[j]=max(f[j],f[j-v[i]]+a[i]);

在這裡必須買了第一種方案才能購買第二種方案,但是我們可以不用進行判定,因為題目求的是最大值,而顯然第一種方案是大於第二種的,所以我們一定會優先選擇第一種。也就是說:如果買了第二種那麼一定會購買第一種,如果第一種不會購買那麼第二種也一定不會考慮。剛好滿足題意,這個地方也是比較巧妙的。

(37)除錯幫助

c 程式設計師有時會用到一種類似於標頭檔案保護的技術,以便有選擇地執行除錯 程式可以包含一些用於除錯的 但這些 只在開發程式時使用。當應用程式編寫完成準備發布時,要先遮蔽掉除錯 這種方法用到兩種預處理功能 assert和ndebug。assert是一種預處理巨集。所謂預處理巨集其實是乙個預處理變數,...

3 7學習筆記

debug模式 如何進入debug模式 執行主函式或者單元測試時,ctrl shift d,j 使用debug模式的目的 1.跟蹤程式是否走預期流程 2.檢視執行過程中某些變數值 debug常用快捷鍵 ctrl shift b 開啟 關閉斷點 ctrl alt b 開啟 跳過已存在的所有斷點 ctr...

37 儲存過程

學習目標 1 了解儲存過程的定義和使用 2 了解儲存過程的使用場景 3 能夠根據業務場景編寫儲存過程解決問題 學習過程 一 儲存過程 在大型資料庫系統中,儲存過程和觸發器具有很重要的作用。無論是儲存過程還是觸發器,都是sql 語句和流程控制語句的集合。就本質而言,觸發器也是一種儲存過程。儲存過程在運...