链接:http://acm.hdu.edu.cn/showproblem.php?pid=2546
思路:如果剩余金额大于五可以任意取,那么肯定是优先把金额最大的最后取,以金额m-5为容量 进行01背包,求得的最大金额加上最后取的物品,就是花费最大的。另外还有一个特殊情况当m<5时,此时什么物品都无法取直接输出m就好了
实现代码;
#include<bits/stdc++.h> using namespace std; const int M = 1e3+10; int a[M],dp[M]; int main() { int n,m; while(cin>>n){ if(n == 0) break; memset(dp,0,sizeof(dp)); for(int i = 1;i <= n;i ++){ cin>>a[i]; } sort(a+1,a+1+n); cin>>m; if(m < 5){ cout<<m<<endl; continue; } for(int i = 1;i < n;i ++){ for(int j = m-5;j >= a[i];j --) dp[j] = max(dp[j],dp[j-a[i]]+a[i]); } int ans = m - dp[m-5] - a[n]; cout<<ans<<endl; } }