2546 飯卡(01揹包,挺好的)
阿新 • • 發佈:2019-01-22
題目地址:http://acm.hdu.edu.cn/showproblem.php?pid=2546
思路:剛開始直接把揹包的容量搞為m-5+max1(max1的值為最貴的菜的價格),因為他最多的能花這麼多,結果錯了,應該把最大的單獨提出來,用5塊來買,剩下的錢做揹包
AC程式碼:
#include <iostream> #include <cstdio> #include <cstdlib> #include <algorithm> #include <queue> #include <stack> #include <map> #include <cstring> #include <climits> #include <cmath> #include <cctype> const int inf = 0x3f3f3f3f;//1061109567 typedef long long LL; #define lson l,m,rt<<1 #define rson m+1,r,rt<<1|1 using namespace std; int dp[1000]; int a[1010]; int main() { int n; while(scanf("%d",&n) && n) { memset(dp,0,sizeof(dp)); int max1 = -1; int k; for(int i=1; i<=n; i++) { scanf("%d",&a[i]); if(a[i] > max1) { max1 = a[i]; k = i; } } int x; scanf("%d",&x); if(x < 5) { printf("%d\n",x); continue; } x -= 5; for(int i=1; i<=n; i++) { if(i == k) continue; for(int j=x; j>=a[i]; j--) { dp[j] = max(dp[j],dp[j-a[i]] + a[i]); } } printf("%d\n",x+5-dp[x]-max1); } return 0; }
錯誤程式碼:(這個會造成價值最大的有可能沒有選,邏輯不對)
#include <iostream> #include <cstdio> #include <cstdlib> #include <algorithm> #include <queue> #include <stack> #include <map> #include <cstring> #include <climits> #include <cmath> #include <cctype> const int inf = 0x3f3f3f3f;//1061109567 typedef long long LL; #define lson l,m,rt<<1 #define rson m+1,r,rt<<1|1 using namespace std; int dp[1060]; int a[1010]; int main() { int n; while(scanf("%d",&n) && n) { memset(dp,0,sizeof(dp)); int max1 = 0; for(int i=1; i<=n; i++) { scanf("%d",&a[i]); if(a[i] > max1) max1 = a[i]; } int cost; scanf("%d",&cost); int x = cost; if(cost < 5) { printf("%d\n",cost); continue; } cost = cost - 5 + max1; for(int i=1; i<=n; i++) { for(int j=cost; j>=a[i]; j--) { dp[j] = max(dp[j],dp[j-a[i]]+a[i]); } } printf("%d\n",x-dp[cost]); } return 0; }