hdu 2159 二维费用背包

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

解题思路:用数组dp[i][j]表示消耗i个忍耐度杀死j个怪做能得到的经验的最大值,dp[i][j]=max(dp[i][j],dp[i-c[k][j-1]+d[k]);

View Code
 1 #include <iostream>
2 #include <cstring>
3 #include <cstdio>
4 #include <algorithm>
5 using namespace std;
6 int max(int x,int y)
7 {
8 if(x>y) return x;
9 else return y;
10 }
11 int dp[105][105];
12 int c[105],d[105];
13 int main()
14 {
15 int n,m,k,s,i,j,sum,tt,flag;
16 while (scanf("%d%d%d%d",&n,&m,&k,&s)!=EOF)
17 {
18 for (i=1;i<=k;i++)
19 scanf("%d%d",&c[i],&d[i]);
20 memset(dp,0,sizeof(dp));
21
22 for (i=1;i<=k;i++)
23 {
24 for (j=d[i];j<=m;j++)
25 for (tt=1;tt<=s;tt++)
26 {
27 dp[j][tt]=max(dp[j][tt],dp[j-d[i]][tt-1]+c[i]);
28 }
29 }
30 flag=0;
31 for (i=1;i<=m;i++)
32 {
33 if(flag)break;
34 for (j=1;j<=s;j++)
35 {
36 if (dp[i][j]>=n)
37 {
38 sum=i;
39 flag=1;
40 break;
41 }
42 }
43 }
44 if(flag) cout<<m-sum<<endl;
45 else cout<<"-1"<<endl;
46 }
47 return 0;
48 }

 

posted @ 2012-03-17 15:27  我们一直在努力  阅读(144)  评论(0编辑  收藏  举报