http://poj.org/problem?id=3624

//题意:Bessie他想在charm bracelet上添加charms,每个charms有一个重量和一个法力值,并且每一种charm有且仅有一个。
//由于Bessie所能承受的重量有限,所以不能无限的添加charms,在规定的重量范围内,如何将获取最大的法力值。
//思路:这是一道01背包的题目,包的容量为M(即:最大所能承受的重量)。
//状态转移方程为:dp[j]=max(dp[j],dp[j-weight[k]]+rank[k]);
#include<stdio.h>
#include<string.h>
int dp[13000];
int weight[3500];
int rank[3500];
int max(int a,int b)
{
    return a>b?a:b;
}
int main()
{
    int m,n;
    int tem1,tem2;
    int sum;
    while(scanf("%d%d",&n,&m)!=EOF)
    {
        sum=0;
        for(int i=0; i<n; i++)
        {
            scanf("%d%d",&tem1,&tem2);
            if(tem1<=m)
            {
                weight[sum]=tem1;
                rank[sum++]=tem2;
            }
        }
        for(int k=0;k<sum;k++)
         for(int j=m;j>=weight[k];j--)
           dp[j]=max(dp[j],dp[j-weight[k]]+rank[k]);
        printf("%d\n",dp[m]);
    }
    return 0;
}

你可能感兴趣的:(http://poj.org/problem?id=3624)