http://acm.hdu.edu.cn/showproblem.php?pid=2546
依旧是0/1背包的问题。 只是 v,w相同。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 #include <iostream> 2 #include <algorithm> 3 #define maxn 1005 4 using namespace std; 5 int f[maxn],v[maxn]; 6 7 int main() 8 { 9 int n, m, i, j; 10 while(cin >> n, n) 11 { 12 for(i = 0; i < n; i++) 13 cin >> v[i]; 14 sort(v,v+n); 15 cin >> m; 16 if(m >= 5) 17 { 18 for(i = 0; i < maxn; i++) 19 f[i] = 0; 20 for(i = 0; i < n-1; i++) 21 for(j = m-5; j >= v[i]; j--) 22 if( f[j-v[i]]+v[i] > f[j] && f[j-v[i]]+v[i] <= m-5) 23 f[j] = f[j-v[i]] + v[i]; 24 cout << m -v[n-1] - f[m-5] << endl; 25 } 26 else cout << m << endl; 27 28 } 29 return 0; 30 }