HDU 5501 貪心 揹包

2021-07-05 18:16:54 字數 554 閱讀 6420

首先想到的是揹包,但是只是純揹包的話,會發現,每個物品取的順序是會影響結果的(就對案例而言,我如果先取了第乙個,再取第二個,就會與最優結果失之交臂)。所以就要考慮,什麼順序取捨最好。然後這個問題就按白書上那樣套套公式啦。。發現是xc/xb 越小,優先順序越高。所以先讀入,排序,在揹包

#include #include #include #include using namespace std;

#define maxn 1010

class node

int get(int t)

void show()

int flag=0;

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

sort(p,p+n,cmp);

for(int i=0;i=0;j--) //此處注意順序,如果是0-t,那麼更新的結果會在之後的計算中被再次更新,如果是t-0,更新的結果不會在這次迴圈中被用到,所以沒問題

}int ans=0;

for(int i=0;i<=t;i++)

ans=max(ans,dp[i]);

cout<

HDu3466 貪心 01揹包

解法 按照p q的大小排列順序,我們會優先選擇p q較大的結點。按照p q排列順序,就變成了01揹包的問題 但是dp和暴力剛好是兩個逆過程,我們暴力是優先選擇q p大的,dp的時候就要反過來,先遍歷q p小的。簡單的證明 當我們遇到兩個都可以選擇的同時被選的結點,pi qjusing namespa...

HDU 2546(貪心 01揹包)

hdu 2546 先貪心以下,然後剩下的再用01揹包求解即可。1 如果餘額 5,不夠買,那麼直接輸出m即可。2 如果餘額 5,那麼先拿出五塊錢來買 最大的菜。然後剩餘的錢再用01揹包算能花掉的最多的錢。然後結合起來節課 include include include include include ...

HDU 2546飯卡 01揹包 貪心

這道題有個小小的坎,就是低於5塊不能選,大於5塊,可以任意選,所以就在初始條件判斷一下剩餘錢數,然後如果大於5的話,這時候就要用到貪心的思想,只要大於等於5,先找最大的那個,然後剩下的再去用揹包去選擇,這樣的結果一定是最優的。因為最大的那個一定會被選中,剩下多少錢都無所謂,用揹包可以獲得剩下的最優解...