hdu 2159 二维完全背包

点击打开链接

#include 
#include 
#include 
using namespace std; 	
const int M =110; 	 					//									决策 :第i种不选 第i种至少选一只	
int vol[M],val[M],dp[M][M]; // dp[i][j][k]  前i种怪兽选j只忍耐度不大于 k的最大价值  =max(dp[i-1][j][k],dp[i][j-1][k-vol[i]]+val[i]) 
int main()
{
	int n,m,k,s;
	while(cin>>n>>m>>k>>s)//(需的经验值)n  (保留的忍耐度)m  (怪的种数)k   (最多的杀怪数)s
	{
		for(int i=1;i<=k;i++)
		{
			cin>>val[i]>>vol[i];	
		}	
	
		memset(dp,0,sizeof(dp)); //前0种 价值0 (没要求装满某个约束条件) 
		
		for(int i=1;i<=k;i++) // 优化到二维 : dp[j][p] 前i种选 j只忍耐度为p的最大价值 
		{
			for(int j=1;j<=s;j++) 
			{
	
				for(int p=1;p<=m;p++) //顺推 保证:dp[j-1][p-vol[i]] 来自前i种 
				{
					if(p>=vol[i])
					{
						dp[j][p]=max(dp[j][p],dp[j-1][p-vol[i]]+val[i]);
					
					}
				}	
			}
		}
		if(dp[s][m]=n中的最小p 
		{
			int Min =m;
			for(int j=1;j<=s;j++)
			{
				for(int p=1;p<=m;p++)
				{
					if(dp[j][p]>=n)
					{
						Min=min(Min,p);
					}
					
				}
			}
			cout<


你可能感兴趣的:(Dynamic,Programming)