您的位置:首页 > 其它

hdu 2546 饭卡(简单DP)

2012-07-28 16:49 429 查看
           简单, 但是需要细心

         思路一: 首先判断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
<<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;
}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: