example:hdu 2546:
解:利用「01揹包」狀態方程:f[v] = max(f[v], f[v-ci]+wi)
(1)對這個問題來說,干擾項是最後的5元,可以買任何一道菜,所以可以先用5元買最貴的一道菜(反正買最後一道菜時至少要有5元餘額,不如先不考慮這5元);去掉干擾項後就是乙個「01」問題了。
(2)一道菜 i 的**menu[i],既是「揹包體積」,又是「揹包價值」。
(3)最優子結構:value[i],表示「i元買菜,可以最多花幾元」。
/*
** 01揹包問題變形
* 目標是找餘額最少的情況,也就是花最多的情況
*/#include #include using namespace std;
int item[1002];
int value[1010]; // value[i]表示i元最多可以花多少
templatet max(const t &a, const t &b)
int main()
cout << (w-value[w-5]) - maxitem << endl;
} return 0;
}
飯卡問題(0 1揹包的變形)
電子科大本部食堂的飯卡有一種很詭異的設計,即在購買之前判斷餘額。如果購買乙個商品之前,卡上的剩餘金額大於或等於5元,就一定可以購買成功 即使購買後卡上餘額為負 否則無法購買 即使金額足夠 所以大家都希望盡量使卡上的餘額最少。某天,食堂中有n種菜 每種菜可購買一次。已知每種菜的 以及卡上的餘額,問最少...
HDU 2546 飯卡 01揹包變形
分析 每種菜可買一次或者不買,所以是01揹包 餘額m 5,只能買 餘額的菜 無法購買 餘額m 5,買最貴的菜 餘額m 5,先用 h m 5 去買菜,再用5去買最貴的菜。h視為揹包容量,菜的 a i 視為重量w和價值c。ac include include includeusing namespace...
01揹包問題變形
一 問題 二 解題思路 三 c 下面是我自己理解寫的,沒有根據標準答案的,那答案在講啥?一直沒法ac,不過還是可以解決問題的。n件物品按單位重量價值降序排序,然後回溯法裝,右結點必要時剪枝,剛好湊成重量為m的若干件物品才能得到乙個解。include define max 50 using names...