题目标题:
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 <iostream>
#include <stdio.h>
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;
}