hdu 2546 0-1背包问题

悲催了..~~    这道01背包的题目我wa 了好多遍,感受还是颇多的...

说是01背包,但是还是有一定的研制条件的。。。

首先当饭卡当中的钱不足5块的时候是不能消费的,所以就应该是原来的值。这里就wa 了很多遍啊s。

然后变通一下,要使得饭卡当中所剩余额最小,那么也就是说最大价格的那道菜要在最后买,这样才能得到最优解,

那么对于其他n-1道菜就是一个简单的0-1背包了,只是这儿有一个变通,那就是背包所能得到的价值和它所耗空间是一样的...

接下来就看代码好好体会了。。。

View Code
 1  #include<iostream>
 2  #include<stdio.h>
 3  using namespace std;
 4  int dp[1010],num[1010],visit[1010];
 5  int main()
 6  {
 7    int n,rest;
 8    while(scanf("%d",&n)!=EOF&&n)
 9    {
10           int pos=n,Maxvalue=0;
11           memset(visit,0,sizeof(visit));
12           for(int i=0;i<n;i++)
13           {
14             scanf("%d",&num[i]);
15             if(num[i]>Maxvalue)
16             {
17                 Maxvalue=num[i];
18                 visit[pos]=0;
19                 pos=i;
20                 visit[pos]=1;
21             }
22           }
23           scanf("%d",&rest);
24           if(rest<5){printf("%d\n",rest);continue;}
25           memset(dp,0,sizeof(dp));
26           for(int i=1;i<=n;i++)
27           {
28               for(int j=rest-5;j>=num[i-1];j--)
29               {
30                    if(visit[i-1])break;
31                    if(dp[j]<dp[j-num[i-1]]+num[i-1]&&rest-dp[j-num[i-1]]-num[i-1]>=5)
32                    {
33                     dp[j]=dp[j-num[i-1]]+num[i-1];   
34                    }
35               }       
36           }
37           printf("%d\n",rest-dp[rest-5]-Maxvalue);
38    }
39    
40    return 0;    
41  }
42  

 

 

转载于:https://www.cnblogs.com/nuoyan2010/archive/2012/09/01/2667095.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值