码迷,mamicode.com
首页 > 其他好文 > 详细

POJ 3260 多重背包+完全背包

时间:2015-02-03 00:37:41      阅读:347      评论:0      收藏:0      [点我收藏+]

标签:

  前几天刚回到家却发现家里没网线 && 路由器都被带走了,无奈之下只好铤而走险尝试蹭隔壁家的WiFi,不试不知道,一试吓一跳,用个手机软件简简单单就连上了,然后在浏览器输入192.168.1.1就能看到他的路由器的一切信息,包括密码,然后打开笔记本……好了,废话不多说,能连上网后第一时间当然是继续和队友之前约好的训练了。

  今天翻看到之前落下的一道混合背包题目,然后在草稿本上慢慢地写递推方程,把一些细节细心地写好…(本来不用太费时间的,可是在家嘛,一会儿妈走来要我教她玩手机,一会儿有一个亲戚朋友来……简直无语了,程序猿最讨厌被人打断的!虽说我不是码农)然后,这道题,细心分析后,发现它是多重背包+完全背包的。

  首先,可以先顺着推出 John手中的coin能拼凑出的币值的最小币数,即设dp[i][j]为前 i 种coin凑出币值 j 时需要的最小币数,很明显,dp[i][j]= min(dp[i-1][j], dp[i][j-coin[i]]+1) 的递推方程很容易想到,但是,这个方程在使用前需要满足很多情况,具体的细节就看代码了(全部都进行了空间优化,其中need数组表示前 i 种coin凑出币值 j 需要的最小币数时,需要的coin[i]的数量),因为之前看过《挑战》中多重背包的实现,所以这个稍微变化一下也不是很难了。

  然后,到了收银员找币时的情况,因为题目中说了她会提供无限的零钱,所以此时就是完全背包了,注意好计算顺序即可:

技术分享
 1 #include<cstdio>
 2 #include<cstring>
 3 #include<algorithm>
 4 using namespace std;
 5 typedef long long LL;
 6 const int maxn= 10000;
 7 
 8 int dp[maxn+3], coin[103],num[103], need[maxn+3];
 9 
10 int main(){
11     int n,t,i,j;
12     while(~scanf("%d%d",&n,&t)){
13         for(i=1; i<=n; ++i)
14             scanf("%d",coin+i);
15         for(i=1; i<=n; ++i)
16             scanf("%d",num+i);
17         memset(dp,-1,sizeof(dp));
18         dp[0]= 0;
19         for(i=1; i<=n; ++i){
20             memset(need,0,sizeof(need));
21             for(j=0; j<=maxn; ++j)
22                 if(j>=coin[i]&& dp[j-coin[i]]!= -1 && need[j]<=num[i]){
23                     if(dp[j]== -1 || dp[j]> dp[j-coin[i]]+1){
24                         dp[j]= dp[j-coin[i]]+1;
25                         need[j]= need[j-coin[i]]+1;
26                     }
27                 }
28         }
29         for(i=1; i<=n; ++i)
30             for(j=maxn-coin[i]; j>=0; --j)
31                 if(dp[j+coin[i]]!= -1){
32                     if(dp[j]== -1)    dp[j]= dp[j+coin[i]]+1;
33                     else    dp[j]= min(dp[j],dp[j+coin[i]]+1);
34                 }
35         printf("%d\n",dp[t]);
36     }
37     return 0;
38 }
View Code

  因为一开始没用到need数组所以调试了一会儿,anyway,人生第一道混合背包的AC,值得纪念,背包问题,继续进取中~~

POJ 3260 多重背包+完全背包

标签:

原文地址:http://www.cnblogs.com/Newdawn/p/4269014.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!