hdu 2546 饭卡(简单DP)

来源:互联网 发布:淘宝直通车推广方案 编辑:程序博客网 时间:2024/05/21 14:47

           简单, 但是需要细心

         思路一: 首先判断m是否大于等于5

                         先取出来最贵的, 对其他的用m-5进行01背包,然后答案就出来了

     

       思路二: 先判断

                         因为最贵50元所以对m+50进行DP

 #include<iostream>#include<cstring>#include<algorithm>  using namespace std; int main() {  int n, m;  int price[1200], dp[1200]; while( cin>>n &&n ) { for(int i=1; i<=n; i++)             cin>>price[i];              cin>>m;                if( m>=5) //这里, 判断        {        sort(price+1, price+n+1);//因为n=1写为n错了很多次    memset(dp, 0, sizeof(dp));   for(int i=1; i<n; i++)   {      for(int j=m-5; j>=price[i]; j--)                  dp[j] = max(dp[j], dp[j-price[i]]+price[i]);   }                cout<<m-dp[m-5]-price[n]<<endl;     } else cout<<m<<endl;  }    } 

思路二:

#include<iostream>#include<cstring>#include<algorithm>  using namespace std; int main() {  int n, m;  int price[1200], dp[1200]; while( cin>>n &&n ) { for(int i=1; i<=n; i++)             cin>>price[i];              cin>>m;                if( m>=5)         {        sort(price+1, price+n+1);//因为n=1写为n错了很多次    memset(dp, 0, sizeof(dp));   dp[0] = 1;    for(int i=1; i<=n; i++)   {      for(int j=m+50; j>=price[i]; j--)          if(j-price[i]<=m-5)                   dp[j] = dp[j] | dp[j-price[i]];            }                        for(int i=m+50; i>=0; i--){     if(dp[i]) {              cout<<m-i<<endl;             break; }             }      } else cout<<m<<endl;  }    }