饭卡 (背包01 一维数组) http://acm.hdu.edu.cn/showproblem.php?pid=2546

时间:2022-10-20 18:44:41
/* 从一组数据中选出n个数,使这n个数的和最接近一个值x, 背包问题, 从一系列菜中,从最贵的菜(MAX)之外中选出几个菜,使菜的总价格sum最接近money-5;money-sum-MAX; 钱数相当于背包总容量,菜相当于价值和体积一样物品; */       #include <iostream> #include <cstdio> #include <cstring> #include <algorithm> using namespace std; int dp[1050]; int main() {     int n;     while(scanf("%d",&n)&&n)     {         int Greens[n];         memset(dp,0,sizeof(dp));         memset(Greens,0,sizeof(Greens));         int max1=-0x3f3f3f3f;         for(int i=0; i<n; i++)             scanf("%d",&Greens[i]);         int money;         scanf("%d",&money);         if(money<5)         {             printf("%d\n",money);             continue;         }         sort(Greens,Greens+n);         for(int i=0;i<n-1;i++) //遍历每道菜             for(int j=money-5;j>=Greens[i];j--) //判断能不能买这种菜             dp[j]=max(dp[j],dp[j-Greens[i]]+Greens[i]);             int MAX=dp[money-5]; //最接近money-5的值         printf("%d\n",money-MAX-Greens[n-1]); //买过可以买的菜之后剩的钱数再买最贵的菜即可以使剩余钱数最少     }     return 0; }