HDU 2546——揹包dp
阿新 • • 發佈:2018-12-17
一道很常規的揹包dp,不過要考慮幾個細節:最後5塊錢的話什麼都可以買,所以最後五塊錢肯定要買最大值的菜價,然後對於m-5的錢,就是裸揹包問題了,直接上01揹包模板就行。
程式碼:
#include <cstdio> #include <cstring> #include <algorithm> #include <iostream> using namespace std; const int maxn=1005; int dp[maxn][maxn];//前i個菜選j個的最大收益 int a[maxn];//菜價格 const int INF=0x3f3f3f3f; int main() { int n,m; while(scanf("%d",&n)!=EOF) { if(n==0)break; for(int i=1;i<=n;i++) { scanf("%d",&a[i]); } scanf("%d",&m); if(m<5) { printf("%d\n",m); continue; } for(int i=0;i<=m;i++) { dp[0][i]=0; } sort(a+1,a+n+1); for(int i=1;i<n;i++) { for(int j=0;j<=m-5;j++) { dp[i][j]=dp[i-1][j]; if(j>=a[i]) dp[i][j]=max(dp[i][j],dp[i-1][j-a[i]]+a[i]); } } printf("%d\n",m-dp[n-1][m-5]-a[n]);//留最後的五塊錢買最大的 } return 0; }