2546 飯卡(01揹包)
阿新 • • 發佈:2018-12-11
演算法:01揹包DP
難度:NOIP---
先把最貴的一種菜找到不用,用剩餘金額減5的金錢去儘可能買 除掉最貴的菜後剩餘的菜類,
最後再用餘下的錢去買最貴的菜
注意:要特判m<5的情況
程式碼如下:
#include <cstdio> #include <iostream> #include <cstring> #include <cstdlib> #include <cmath> #include <algorithm> #include <queue> #include <deque> #define ll long long #define N 1005 using namespace std; int dp[N],v[N]; int main() { int n; while((scanf("%d",&n)!=EOF)&&(n)) { int m; //memset(v,0,sizeof(v));可以不清此陣列 memset(dp,0,sizeof(dp)); for(int i = 1;i <= n;i++) { scanf("%d",&v[i]); } scanf("%d",&m); if(m<5)//什麼也買不了 { printf("%d\n",m); continue; } sort(v+1,v+1+n); for(int i = 1;i < n;i++) { for(int j = m-5/*不要忘記j的初值是m-5*/;j >= v[i];j--) { dp[j]=max(dp[j],dp[j-v[i]]+v[i]); } } printf("%d\n",m-dp[m-5]-v[n]); } return 0 ; }