HDU3033 I love sneakers!(分组背包)

来源:互联网 发布:一键瞬狙软件 编辑:程序博客网 时间:2024/06/06 04:09

至少选一个的分组背包。

0下标外均初始化为-1。那么对于每组第j个,首先将其与本组比较,有dp[i][l] = max(dp[i][l], dp[i][l-w[j]] + v[j]),因为是初始化为-1,所以这一过程一定是必选的。

然后再与i-1组的比较,更新的才是前i组的最优值。

代码:

#include <iostream>#include <cstdio>#include <cstring>#include <vector>#include <algorithm>using namespace std;int n,m,k,t,v[105],p[105],dp[105][10005],flag;vector<int> b[15];int max(int a,int b,int c){    return a>b?a>c?a:c:b>c?b:c;}int main(){freopen("/Users/apple/input.txt","r",stdin);freopen("/Users/apple/out.txt","w",stdout);    while(scanf("%d%d%d",&n,&m,&k)!=EOF){        flag=0;        memset(dp,-1,sizeof(dp));        for(int i=0;i<=m;i++)dp[0][i]=0;        for(int i=1;i<=n;i++) {            scanf("%d%d%d",&t,&p[i],&v[i]);            b[t].push_back(i);        }        for(int i=1;i<=k;i++){            int len=b[i].size();            for(int j=0;j<len;j++){                t=b[i][j];                for(int l=m;l>=p[t];l--){                    dp[i][l]=max(dp[i][l],dp[i][l-p[t]]+v[t],dp[i-1][l-p[t]]+v[t]);                }            }        }        if(dp[k][m]<0)puts("Impossible");        else printf("%d\n",dp[k][m]);    }    return 0;}     

0 0
原创粉丝点击