簡單, 但是需要細心
思路一: 首先判斷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;
}
}