1. hdu 2546 饭卡
分析: 1,当卡上金额小于5元时,不能买任何菜。
2,否则,状态转移方程: f[ j ] = max ( f [ j ] , f [ j -price [ i ] ]+price [ i ] ); f [ j ]表示买第 i个菜时的预算为 j = m-5 时的最大开销。
排序是为了选出最贵的菜,可以不排序直接选。
sort(W+1,W+n+1);
m=m-5;
for(int i=1;i<n;i++)
{
for(int j=m;j>0;j--)
if(j>=W[i]) dp[j]=max(dp[j],dp[j-W[i]]+W[i]);
}
printf("%d\n",m+5-dp[m]-W[n]);
2. hdu 3466 ( Proud Merchants )
题意:
你有 m 元 钱去一个国家买物品, 这个国家有 n 见物品,每件物品有价格price,价值 Vi ,另外还有一个特征 Qi,买该物品时你拥有的钱必须比小于Qi才能买到这个 商 品。求能得到的最大的价值。
分析: 1,对每个商品的 Qi - price从小到大排序; 排序原因.
2,特征方程与上题差不多,不多说了。
题意:
现有一笔经费可以报销一定额度的发票。允许报销的发票类型包括买图书(A类)、文具(B类)、差旅(C类),要求每张发票的总额不得超过1000元,每张发票上,单项物品的价值不得超过600元。现请你编写程序,在给出的一堆发票中找出可以报销的、不超过给定额度的最大报销额。
分析: 1.只要精确两位小数,为了避免用double 数做背包容量造成的精度损失,将其*100放大为整数;
2. 对每张发票进行筛选,选出 价值数组。
3. 利用转移方程处理。
4。hdu 2955 Robberiers
题意:
去银行抢钱,每一家银行有一定的钱数和抢钱被捉住的概率,问你在不超过给出的被捉住的最大概率 p 情况下求抢得得钱数最多。
分析: 由于不能用double 做背包荣量,要进行一些小的处理:
1. 求出抢每家银行能逃跑的概率;
2。 用所有银行金额的总和做背包容量,那么最后逃跑概率的乘积应大于1-p时为满足要求的钱数。