TOJ 1536



题目标题:


Accepted Necklace


题目连接:


http://acm.tzc.edu.cn/acmhome/problemdetail.do?&method=showdetail&id=1536


题目类型:


动态规划 - 多维背包



数据结构:

int dp[1005][25];  //重量 个数
  
struct LMIC_PACK
{
	int v, w;
};


思路分析:


比较典型的多维背包

一个维是重量

一个维是个数

重量要求个数一定要恰好等于给定的值

所以我们在初始化的时候要初始化成负无穷


证明:


源代码:

#include 
#include 

using namespace std;

int n, m, w;
int dp[1005][25];  
  
struct LMIC_PACK
{
	int v, w;
};

void _ini()
{
	int i, j;
	
	for( i = 0; i < 1005; i ++ )
	{
		for( j = 0; j < 25; j ++ )
		{
			if( !j )
			{
				dp[i][j] = 0;
			}
			else
			{
				dp[i][j] = -9999999;
			}
		}
	}
}

int main()
{
	int i, j, k, t;
	LMIC_PACK arr[25];
	
	scanf( "%d", &t );
	
	while( t -- )
	{
		_ini();
		
		scanf( "%d%d", &n, &m );
		
		for( i = 1; i <= n; i ++ )
		{
			scanf( "%d%d", &arr[i].v, &arr[i].w );
		}
		
		scanf( "%d", &w );
		
		for( i = 1; i <= n; i ++ )
		{
			for( j = w; j >= arr[i].w; j -- )
			{
				for( k = m; k >= 1; k -- )
				{
					dp[j][k] = max( dp[j][k], dp[j - arr[i].w][k - 1] + arr[i].v ); 
				}
			} 
		}
		
		printf( "%d\n", dp[w][m] < 0 ? 0 : dp[w][m] );
	}
	return 0;
}


你可能感兴趣的:(ACM解题报告,动态规划)