简单, 但是需要细心
思路一: 首先判断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;
}
}