1017

来源:互联网 发布:vue.js基础教程 编辑:程序博客网 时间:2024/05/18 01:10

题意:给定一组产品以及他们的value,还有包的所能容纳的价值,求包内装产品的最大价值

思路:不难得出状态方程为     dp[j] = max ( dp[j] , dp[  j-w[i] ] +v[i] ])

感想:属于01背包问题,只要掌握了一个,这一类都可以类比出来。


#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;  
}  
#include<iostream>    
#include<cstdio>    
#include<cstdlib>    
#include<cstring>    
#include<string>    
#include<queue>    
#include<algorithm>    
#include<map>    
#include<iomanip>    
#define INF 99999999    
using namespace std;    
    
const int MAX=100;    
int height[MAX];    
    
typedef struct node{    
    int w;    
    int l;    
    int h;    
    bool operator<(node b)const{    
        if(w == b.w)return l>b.l;    
        return w>b.w;    
    }    
};    
node s[MAX];    
    
int main(){    
    int n,a,b,c,num=1;    
    while(cin>>n,n){    
        int k=0;    
        for(int i=0;i<n;++i){    
            cin>>a>>b>>c;    
            //对a,b,c排序.     
            if(a>b)a=a+b,b=a-b,a=a-b;    
            if(a>c)a=a+c,c=a-c,a=a-c;    
            if(b>c)b=b+c,c=b-c,b=b-c;    
            s[k].w=a,s[k].l=b,s[k++].h=c;//以a,b为底,c为高.     
            s[k].w=a,s[k].l=c,s[k++].h=b;//以a,c为底,b为高.    
            s[k].w=b,s[k].l=c,s[k++].h=a;//以b.c为底,a为高.     
        }    
        sort(s,s+k);     
        int Max=s[0].h;    
        height[0]=s[0].h;    
        for(int i=1;i<k;++i){    
            height[i]=s[i].h;    
            for(int j=0;j<i;++j){    
                if(s[i].w<s[j].w && s[i].l<s[j].l){    
                    height[i]=max(height[i],s[i].h+height[j]);    
                }    
            }    
            Max=max(Max,height[i]);    
        }    
        cout<<"Case "<<num++<<": maximum height = "<<Max<<endl;    
    }    
    return 0;    
}    
0 0