杭电2159背包问题!

来源:互联网 发布:activiti java 代码 编辑:程序博客网 时间:2024/05/02 01:59
#include<iostream>int A[101][101];//定义一个数组! using namespace std;int main(){    int i,j,t,n,m,k,s,a,b;    while(scanf("%d%d%d%d",&n,&m,&k,&s)!=EOF)    {        memset(A,0,sizeof(A));//首先赋初值,        for(i=1;i<=k;i++)        {            scanf("%d%d",&a,&b);            for(j=b;j<=m;j++)            for(t=1;t<=s;t++)            A[j][t]=(A[j][t]>A[j-b][t-1]+a) ?A[j][t]:A[j-b][t-1]+a;//利用二维背包法,计算出杀第第i敌人是的经验与忍耐度,在比较一前一后的大小!        }        if(A[m][s]>=n)//判断是否达到最大?        {            for(i=0;i<=m;i++)            if(A[i][s]>=n)//判断出第i个敌人是能达到的经验值! (当还少于n时才能够满足条件)!            {                printf("%d\n",m-i);//找出符合题意了!                break;            }        }            else            printf("-1\n");    }    return 0;}