题目链接:hdu-2546
思路:DP[i][j]存的是j价格买i个物品最贵的价格,然后把二维变一维,第二层循环从后向前,依次覆盖上一层的dp
#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
int dp[1005];//dp存的J价格在0~i物品中可以购买到的最大价格
int main()
{
int money,i,j,k,m,n,s[1005],t,temp,end,maxt,sum;
while(cin>>n,n)
{
memset(dp,0,sizeof(dp));
for(i=1;i<=n;i++)
{
cin>>s[i];
}
sort(s+1,s+1+n);
cin>>money;
if(money<5)//小于5元,直接输出
{
end=money;
}
else
{
money=money-5;//5元买最贵的
for(i=1;i<=n-1;i++)
{
for(j=money;j>=s[i];j--)//用的 一维,只能倒叙
dp[j]=max(dp[j],dp[j-s[i]]+s[i]);//选与不选此物体,max的dp[j]存的是上层j位置的数据
}
end=money+5-dp[money]-s[n];
}
cout<<end<<endl;
}
}