HDOJ 3033 I love sneakers! (分组背包)

来源:互联网 发布:fifaol3数据库电脑版 编辑:程序博客网 时间:2024/05/29 16:02

超级传送门


dp[i][j]表示对于第i组物品,在花费j价格时的最大价值,有三个子状态

dp[i][j]表示不取该物品

dp[i][j-w]+v 表示选择该物品,但不是第一次

dp[i-1][j-w]+v表示选择该物品,但是是第一次

dp[i][j]=max(dp[i][j],dp[i-1][j-w]+v,dp[i][j-w]+v);

/*HODJ3033作者:陈佳润2013-04-30*/#include<iostream>#include<string.h>#include<queue>using namespace std;#define max(a,b) (a>b?a:b)queue<int>QV[12];//存放一组内物品的价值queue<int>QW[12];//存放一组内物品的代价int dp[110][10005];int m,n,k;void GroupPack(int k){int i;while(!QW[k].empty()){//对于每一组内的物品for(i=m;i>=QW[k].front();i--){//对于每一个物品空间if(i>=QW[k].front()){//在三个状态中找出最优的dp[k][i]=max(dp[k][i],dp[k][i-QW[k].front()]+QV[k].front());dp[k][i]=max(dp[k][i],dp[k-1][i-QW[k].front()]+QV[k].front());}}QW[k].pop();QV[k].pop();}}int main(){int i,a,b,c,j;while(cin>>n>>m>>k){    //初始化for(i=1;i<=k;i++){for(j=0;j<=m;j++)dp[i][j]=-1;}for(i=0;i<=m;i++) dp[0][i]=0;//读取for(i=1;i<=n;i++){cin>>a>>b>>c;QV[a].push(c);QW[a].push(b);}for(i=1;i<=k;i++){//分组背包GroupPack(i);}if(dp[k][m]<0)cout<<"Impossible"<<endl;elsecout<<dp[k][m]<<endl;}return 0;}


原创粉丝点击