hdu 2546

来源:互联网 发布:数据库ip地址查询器 编辑:程序博客网 时间:2024/05/22 00:35
#include<stdio.h>#include<string.h>int dp[1000];int Max(int a,int b){return a > b ? a : b;}int main(){int n,max,i,u,j,m,a[1005];while(scanf("%d",&n),n!=0){memset(dp,0,sizeof(dp));max=-1;for(i=1;i<=n;i++){scanf("%d",&a[i]);if(max<a[i]){max=a[i];u=i;}}scanf("%d",&m);if(m<5)//注意考虑{printf("%d\n",m);continue;}for(i=1;i<=n;i++){for(j=m-5;j>=a[i];j--){if(i!=u)                 dp[j]=Max(dp[j],dp[j-a[i]]+a[i]);}}  printf("%d\n",m-dp[m-5]-max);}return 0;}题意:输入n,表示有n种菜可购买,再输入n个数v[i],表示菜的价格,再输入m,表示卡上有m元,规定若卡上余额大于等于5则可购买任意价钱的物品(即使买后余额为负),否则不可购买任何物品,求最后卡上最小余额解法:01背包+贪心:最贵的物品肯定要被购买到,所以先选出来最后购买。先对除了最贵的物品外其余物品进行01背包处理,总容量为m-5,物品费用和价值都为w[i]。

0 0
原创粉丝点击