UVA - 10130 SuperSale

来源:互联网 发布:java gis地图开发 编辑:程序博客网 时间:2024/06/05 22:54

就是01背包,每个人同一件物品只能拿一个,但不同人可以拿同一件物品。。。

开始以为每件物品只有一件,一下子觉得这问题太难了。。首先最优子结构找不到,如果一个人的背包拿最优的,可能就会影响其他人拿得,最终导致总结果不是最优,也就是不具备无后效性,就想着怎么转化问题。。。可是一直想不出来,看了别人的题解,才猛然发现原来题目中没说一种物品只有一件,实际上是可以有多件的。。。

#include<cstdio>#include<cstring>#include<algorithm>#define MAX1 1100#define MAX2 100using namespace std;int s[MAX1][2],fam[MAX2],dp[MAX1][MAX2];int main(){    int t,n,g,i,j,tt,all;    scanf("%d",&t);    while(t--)    {        scanf("%d",&n);        for(i=1;i<=n;i++)            scanf("%d %d",&s[i][0],&s[i][1]);        scanf("%d",&g);        for(i=0;i<g;i++)            scanf("%d",&fam[i]);        all=0;        for(i=0;i<g;i++)        {            memset(dp,0,MAX1*MAX2*4);            for(j=1;j<=n;j++)            {                for(tt=0;tt<=fam[i];tt++)                {                    if(tt>=s[j][1])                    {                        dp[j][tt]=max(dp[j-1][tt-s[j][1]]+s[j][0],dp[j-1][tt]);                    }                    else                        dp[j][tt]=dp[j-1][tt];                }            }            all+=dp[n][fam[i]];        }        printf("%d\n",all);    }    return 0;}


0 0
原创粉丝点击