hdu 3449 Consumer 01背包

http://acm.hdu.edu.cn/showproblem.php?pid=3449

这个题AC的有点稀里糊涂(是1A过的),采用的01背包的方法;

思路:定义了两个数组用来存储最终结果和但购买这一组的篮子是的价值,然后a[j]=max(a[j],b[j-link[i].pi]);

把最终结果给a[],每次找完一组的时候更新一下;

View Code
 1 #include<iostream>
2 #include<cstring>
3 #include<algorithm>
4 #include<cstdlib>
5 #include<cstdio>
6 using namespace std;
7 int a[100010],b[100010];
8 struct node
9 {
10 int pi;
11 int num;
12 int price[15];
13 int vlaue[15];
14 }link[55];
15 int main()
16 {
17 int n,s,i,j,k;
18 while(scanf("%d%d",&n,&s)!=EOF)
19 {
20 for(i=0;i<=s;i++)
21 a[i]=b[i]=0;
22 for(i=1;i<=n;i++)
23 {
24 scanf("%d%d",&link[i].pi,&link[i].num);
25 for(j=1;j<=link[i].num;j++)
26 scanf("%d%d",&link[i].price[j],&link[i].vlaue[j]);
27 }
28 for(i=1;i<=n;i++)
29 {
30 for(j=0;j<=s;j++)
31 b[j]=a[j];
32 for(j=1;j<=link[i].num;j++)
33 for(k=s;k>=link[i].price[j];k--)
34 if(b[k]<b[k-link[i].price[j]]+link[i].vlaue[j])
35 b[k]=b[k-link[i].price[j]]+link[i].vlaue[j];
36 for(j=s;j>=link[i].pi;j--)
37 {
38 a[j]=max(a[j],b[j-link[i].pi]);
39 }
40 }
41 printf("%d\n",a[s]);
42 }
43 }



posted @ 2011-11-25 21:57  LT-blogs  阅读(287)  评论(0编辑  收藏  举报