HDU 4501 小明系列故事 買年貨

2021-08-10 18:52:09 字數 1079 閱讀 8101

解題思路:

三維揹包,設定dp[i][j][k]代表有i塊錢,有j個積分和k個免費物品的時候,可以得到的最大價值。

則對於當前物品,我有兩種選擇:

第一種:不買

第二種:買

如果選擇買又分了三種情況,

1.用錢買。   

dp[i-錢][j][k] + 價值

2.用積分買。 dp[i][j-積分][k] + 價值

3.免費拿。     dp[i][j][k-1] + 價值

聯合第一種情況:dp[i][j][k],從四個數中取最大值。

然後我就按01揹包做了,我做的時候是考慮裝第t個物品的時候,錢數大於該物品的**,積分

也大於該物品的積分,結果發現跑的時候答案不對,我才意識到,如果該人未帶錢,可以用積分

買或免費拿,當人沒有積分,可以用錢買或免費拿,當商場不給k個免費機會的時候,可以用錢和

積分,而我上面的根本沒法弄他們是0的情況。所以每層迴圈最後都是從容量到0,然後後續的

操作中我們可以判斷,如果錢還夠,就考慮用錢買的情況,否則不考慮,如果積分還夠考慮用

積分買的情況,否則不考慮,如果免費拿的機會還沒用完,即考慮免費拿的情況,否則不考慮該

情況。總複雜度:100*100*100*50.穩過。

ac**:

#include #include #include using namespace std;

const int maxn = 105;

int n,v1,v2,k;

int price[maxn],score[maxn],value[maxn];

int dp[maxn][maxn][maxn/2];

int max(int a,int b,int c,int d)

int main()

memset(dp,0,sizeof(dp));

int x1,x2,x3,x4;

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

}printf("%d\n",dp[v1][v2][k]);

}return 0;

}

小明系列故事 買年貨(HDU)

題意理解 有n個可以買的年貨,每個年貨有單價,抵扣的積分和實際的價值,小明手裡有v1的錢,v2的積分,可免費的年貨數量k。問如何買才能使年貨總的價值最大?問題分析 多維01揹包問題,用dp。動態規劃要找狀態,然後找狀態轉移方程。對於本題,狀態是dp ii jj kk ll 表示前ii個年貨花了jj錢...

HDU 4528 小明系列故事 捉迷藏

小明的媽媽生了三個孩子,老大叫大明,老二叫二明,老三.老三自然就叫小明了。一天,小明的媽媽帶小明兄弟三人去公園玩耍,公園裡面樹木很多,有很多地方可以藏身,於是他們決定玩捉迷藏。經過幾輪的猜拳後,第一輪是小明來找其他兩個人,遊戲規則很簡單 只要小明可以在規定的時間內找到他們就算小明獲勝,並且被發現的兩...

hdu 4528小明系列故事 捉迷藏 (bfs)

題意 就是三個傻明玩捉迷藏,小明負責找大的和二的,直線可以看見就算找到,人擋著人都不行!問小明可不可以在規定時間完成任務。思路 就是正常的bfs,只不過有些細節處理需要注意,比如能否看到大明二明,保證兩點中間都是 還有就是去重,這裡需要注意,小明是可以走回頭路的,比如大明在左上,二明在右上,小明就要...