分析:可以转化为01背包。。解决这个问题需要两个步骤。。
(1)留下5元钱去买最贵的菜。(要注意排除 m < 5 的情况)
(2)用剩下的 m-5 元去买尽量贵的菜。(01背包问题)
#include<iostream> #include<string.h> using namespace std; int max(int a, int b) { return a>b ? a : b; } int main() { int n; while(cin>>n && n) { int i, j, m, c[1011], ma=0, f[1011], k; for(i=1; i<=n; i++) { cin>>c[i]; if(ma<c[i]) {ma=c[i]; k=i;} //找出最贵的菜 ma, 用k标记 } cin>>m; if(m<5) //m小于5,直接输出 { cout<<m<<endl; } else { memset(f, 0, sizeof(f)); for(i=1; i<=n; i++) { for(j=m; j>=0; j--) { if(j>=c[i] && i!=k) { f[j]=max(f[j] , f[j-c[i]]+c[i]); //状态转移方程 } } } cout<<m-f[m-5]-ma<<endl; //f[m-5]剩下的钱买的最贵的菜,也可以在前面的循环中令j=m-5; } } return 0; }
hdu 2546 饭卡 01背包,布布扣,bubuko.com
原文:http://www.cnblogs.com/xtaq/p/3579038.html