1017-Q专题三

1.题号:1017-Q

2.题意:装包问题:给出一组产品的价值、体积以及包的容量,求这个包包能装产品具有的最大价值。

3.思路:是0-1背包的问题,将价值的总和平分,让其转化为0-1背包的问题,状态方程: dp[j] = max(dp[j],dp[j-val[i]]+val[i])。

4.感想:0-1背包的问题是重点,好多题都是。


AC代码

#include<stdio.h>    
#include<string.h>    
#include<algorithm>    
using namespace std;  
const int MAX = 1005;  
int w[MAX];  
int v[MAX];  
int dp[MAX];  
int main()  
{  
    int t, n, m;  
    scanf("%d", &t);  
    while (t--)  
    {  
        memset(w, 0, sizeof(w));  
        memset(v, 0, sizeof(v));  
        memset(dp, 0, sizeof(dp));  
        scanf("%d%d", &n, &m);  
        for (int i = 1; i <= n; i++)  
            scanf("%d", &v[i]);  
        for (int i = 1; i <= n; i++)  
            scanf("%d", &w[i]);  
        for (int i = 1; i <= n; i++)  
        {  
            for (int j = m; j >= 0; j--)  
            {  
                if (j >= w[i])   
                    dp[j] = max(dp[j], dp[j - w[i]] + v[i]);  
            }  
        }  
        printf("%d\n", dp[m]);  
    }  
    return 0;  
} 


你可能感兴趣的:(1017-Q专题三)