HDU 2159 dp

来源:互联网 发布:unity3d 自动寻路 编辑:程序博客网 时间:2024/05/16 15:48

2014/9/16


二维背包...等于维护的值有两个,dp后再去遍历取出满足两种限制的最优解(满足两种情况的方案有很多,取优)。

http://blog.csdn.net/meme_y/article/details/8880495

这篇博客写得不错归纳很好,不像以前那种看一篇一篇看不懂的题解(修炼不到家写毛博客)


//阳光刺痛双眸#include<stdio.h>#include<string.h>#include<cmath> #include<algorithm>#include<iostream>#include<queue>#include<stack>#include<map>#include<climits>#include<vector>using namespace std;typedef long long ll;  #define f(x,y,i) for(int i = x;i < y; i++)#define ff(x,y,i) for(int i = x;i  <= y; i++)#define F(x,y,i) for(int i = x; i >= y; i--)#define FF(x,y,i) for(int i = x; i > y; i++)#define lson pos<<1,l,mid#define rson pos<<1|1,mid+1,r#define sc(n) scanf("%d",&n)#define pr(n) printf("%d\n",n)#define met(n,m) memset(n, m, sizeof(n)) #define mod 10007const int N=110;int n , m , d, a , b, k , s;int Max(int a,int b){return a>b?a:b;}int Min(int a,int b){return a<b?a:b;}int c[N];int v[N];int dp[N][N];int main(){   while(~scanf("%d%d%d%d",&n,&m,&k,&s))   {   met(dp,0);    f(1,k+1,i)   {             //经验 耐久  scanf("%d%d",&v[i],&c[i]);     }      for(int i = 1; i<= k; i++)//每只怪一个个来判断杀不杀        {       for(int j = 1;j <= s; j++)//一共只能杀s只怪        {       for(int q = c[i];q <= m; q++)//这种怪 杀不杀上一只= =?        {       dp[j][q]=Max(dp[j][q], dp[j-1][q - c[i]]+v[i]);       }       }       }                         int i;       for( i = 1;i<= m; i++)       {        if(dp[s][i] >= n)        {        break;        }       }       if(i== m+1)printf("-1\n");       else  printf("%d\n",m - i);        }    return 0;}


0 0
原创粉丝点击