TOJ 1536

来源:互联网 发布:理光复印机网络打印 编辑:程序博客网 时间:2024/06/17 00:43


题目标题:


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;}


0 0
原创粉丝点击