飯卡:
電子科大本部食堂的飯卡有一種很詭異的設計,即在購買之前判斷餘額。如果購買乙個商品之前,卡上的剩餘金額大於或等於5元,就一定可以購買成功(即使購買後卡上餘額為負),否則無法購買(即使金額足夠)。所以大家都希望盡量使卡上的餘額最少。
某天,食堂中有n種菜**,每種菜可購買一次。已知每種菜的**以及卡上的餘額,問最少可使卡上的餘額為多少。
input多組資料。對於每組資料:
第一行為正整數n,表示菜的數量。n<=1000。
第二行包括n個正整數,表示每種菜的**。**不超過50。
第三行包括乙個正整數m,表示卡上的餘額。m<=1000。
n=0表示資料結束。
output對於每組輸入,輸出一行,包含乙個整數,表示卡上可能的最小餘額。sample input
1505sample output101 2 3 2 1 1 2 3 2 1
500
-4532
#include #include#include
using
namespace
std;
int cmp(int a,int b)
intmain()
,dp[2013] = ;
for(i = 1; i<=n; i++)
scanf("%d
",&price[i]);
sort(price+1,price+1+n,cmp);
int max=price[n];
intj,m;
scanf("%d
",&m);
if(m<5)//
低於5元不能購買
m-=5;//
取出5元用於購買最貴的物品
for(int i = 1; i//
01揹包
}printf(
"%d\n
",m+5-dp[m]-max);
}return0;
}
#include#define n 1010#include#include
#include
intpri[n];
intm,n;
intdp[n];
using
namespace
std;
intmain()
scanf("%d
",&m);
sort(pri+1,pri+n+1
);
if(m<5
)
for(int i=1;i)
}printf(
"%d\n
",m-dp[m-5]-pri[n]);
}}
揹包九講之 01揹包
01揹包是最基礎的揹包問題,其中01代表的就是第i個物品的選或不選,在此先設v i 為體積,w i 為價值。很顯然,我們可以使用二位陣列dp i j 來表示前i個物品在揹包容量為j的時候可存放的最大價值。首先dp 0 0 0是很顯然的。而計算dp i j 時,存在01兩種情況 選或不選第i件物品。1...
揹包九講 01揹包問題
1 01揹包問題描述 已知 有 n 件物品和乙個容量為 v 的揹包。第i件物品的重量為w i 得到的價值是 c i 問題 求解將哪些物品裝入揹包可使價值總和最大。條件 每種物品只有一件,可以選擇放或者不放 2 基本思路 01揹包的特點 每種物品只有一件,可以選擇放或者不放 子問題定義狀態f i v ...
揹包九講專題 01揹包
樸素2維無優化寫法 includeusing namespace std const int maxn 1e3 5 int dp maxn maxn v maxn w maxn intmain printf d n dp n m view code 優化1維寫法 關於優化是怎麼來的?首先為什麼第二個...