1. 程式人生 > >Re0:DP學習之路 飯卡 HDU - 2546

Re0:DP學習之路 飯卡 HDU - 2546

解法

01揹包變式,首先貪心的想一下如果要保證餘額最小那麼就需要用相減後最小的錢減去之前最大的價格,且得保證這個錢在5元以上

對於尋找如何減最多能包含在5元以上,這裡用01揹包

我們把價錢看做體積裝進一個餘額-5的01揹包內,為什麼是餘額-5?

因為我們要保證總的價格在5元以上,還得保證不裝最後一個,因為要減去最後一個

最後我們用原來的餘額-裝的最多的物品的價格-最大的物品的價格就是答案

注意還要特判本來m就小於5的情況

程式碼

#include <bits/stdc++.h>
using namespace std;
int v[1200],dp[1200];
int main()
{
  ios::sync_with_stdio(0);
  cin.tie(0);
  cout.tie(0);
  int n,m;
  while(cin>>n&&n)
  {
    memset(dp,0,sizeof(dp));
    for(int i=1;i<=n;i++)
    cin>>v[i];
    cin>>m;
    if(m<5)
    cout<<m<<"\n";
    else
    {
      m-=5;
      sort(v+1,v+1+n);
      for(int i=1;i<n;i++)
      for(int j=m;j>=v[i];j--)
      dp[j]=max(dp[j],dp[j-v[i]]+v[i]);
      cout<<m+5-dp[m]-v[n]<<"\n";
    }
  }
}