#include<iostream>
#include<stdio.h>
using namespace std;
#define MAX 1000
//#define MAX 1000
class Point
{
public:
int flower;
int cost;
};
int N,M;
int collect[MAX][MAX];
int money[MAX];//每一种花花多少钱
void init()
{
int i,j;
for(i=0;i<MAX;i++)
for(j=0;j<MAX;j++)
collect[i][j]=-1;
}
int dp(Point p)
{
//如果访问过
if(collect[p.flower][p.cost]!=-1)
{
return collect[p.flower][p.cost];
}
//如果到达最大限度
if(p.cost==M)
{
collect[p.flower][p.cost]=p.flower;
return collect[p.flower][p.cost];
}
int tmax=-1;int i=0;
Point cs;
for(i=0;i<N;i++)
{
cs.flower=p.flower+1;cs.cost=p.cost;cs.cost+=money[i];
if(cs.cost>M)
continue;
int fmax=dp(cs);
if(tmax<fmax)
tmax=fmax;
}
if(tmax==-1)//如果没有买花
{
tmax=p.flower;
}
collect[p.flower][p.cost]=tmax;
return collect[p.flower][p.cost];
}
int main()
{
//freopen("in.txt","r",stdin);
while(scanf("%d %d",&N,&M)!=EOF)
{
//初始化
init();
int i=0;
//输入钱
for(i=0;i<N;i++)
{
scanf("%d",&money[i]);
}
//处理
Point start;start.cost=0;start.flower=0;
int result=dp(start);
//输出
cout<<result<<endl;
}
return 0;
}
hdoj 1587(背包问题)(我利用动态规划完成)
最新推荐文章于 2023-11-04 23:45:29 发布