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

[HDU 3033] I love sneakers! (动态规划分组背包)

时间:2014-10-27 12:31:48      阅读:214      评论:0      收藏:0      [点我收藏+]

标签:style   blog   http   color   io   os   ar   for   sp   

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3033

题意:给你K种品牌,每种品牌有不同种鞋,现在每种品牌至少挑一款鞋,问获得的最大价值,如果不能每种品牌都挑到则输出Impossible

 

自己太弱了!!!!!这个题都想不出来!!!!!还要看题解!!!!!!

设计状态dp[i][j]代表从前i种品牌里花了不超过j元钱。

那么状态转移可以这样:

1.我只买第i种品牌的第k个。

2.我在第i种品牌里不光买第k个。

变成状态转移方程就是:

1. dp[i][j] = dp[i-1][j-p[i][k]]+v[i][k];

2. dp[i][j] = dp[i][j-p[i][k]]+v[i][k];

对于每组,是一个01背包问题。

两个取最大。

本人太弱了。。这种题还看题解- -

代码:

 1 #include <cstdio>
 2 #include <algorithm>
 3 #include <cstring>
 4 #include <cmath>
 5 #include <map>
 6 #include <iterator>
 7 #include <vector>
 8 using namespace std;
 9 typedef long long LL;
10 
11 int N,M,K;
12 int p[11][111],v[11][111];
13 int dp[11][11111];
14 const int INF = 99999999;
15 
16 int main(){
17     while(scanf("%d%d%d",&N,&M,&K)!=EOF){
18         memset(p,0,sizeof(p));
19         memset(v,0,sizeof(v));
20         for(int i=1;i<=N;i++){
21             int x,y,z;
22             scanf("%d%d%d",&x,&y,&z);
23             p[x][++p[x][0]] = y;
24             v[x][++v[x][0]] = z;
25         }
26         for(int i=1;i<11;i++){
27             for(int j=0;j<11111;j++){
28                 dp[i][j] = -INF;
29             }
30         }
31 //        dp[0][0] = 0;
32         for(int i=1;i<=K;i++){
33             for(int k=1;k<=p[i][0];k++){
34                 for(int j=M;j>=p[i][k];j--){
35                         dp[i][j] = max(dp[i][j],max(dp[i-1][j-p[i][k]]+v[i][k],dp[i][j-p[i][k]]+v[i][k]));
36                 }
37             }
38         }
39         if(dp[K][M]<0) puts("Impossible");
40         else printf("%d\n",dp[K][M]);
41     }
42     return 0;
43 }

 

[HDU 3033] I love sneakers! (动态规划分组背包)

标签:style   blog   http   color   io   os   ar   for   sp   

原文地址:http://www.cnblogs.com/llkpersonal/p/4053680.html

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