HDOJ 3033 I love sneakers! (分组背包)
2013-04-30 18:12
239 查看
超级传送门
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);
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; else cout<<dp[k][m]<<endl; } return 0; }
相关文章推荐
- HDOJ 题目3033 I love sneakers!(分组背包)
- HDOJ 3033 I love sneakers!(分组背包变型)
- (DP,分组背包) I love sneakers! -- HDOJ
- hdu 3033 I love sneakers! 分组背包
- hdu 3033 I love sneakers! 分组背包
- HDU 3033 I love sneakers!(分组背包/至少选一个)
- HDU 3033 I love sneakers! 每组最至少取一个的分组背包
- HDU 3033 I love sneakers! (分组背包)
- hdu 3033 I love sneakers! 分组背包
- HDU 3033 I love sneakers! (分组背包 每组至少选一个)
- HDU 3033 I love sneakers! (变形分组背包)
- hdu 3033 I love sneakers!(分组背包,每组至少取一件)
- hdu 3033 I love sneakers! 分组背包
- HDU 3033 I love sneakers!(分组背包变形)
- HDU 3033 I love sneakers! 分组背包
- HDU 3033 I love sneakers! 分组背包+约束限制(每组至少取一个)。
- hdu 3033 I love sneakers! 必选分组背包
- [HDU 3033] I love sneakers! (动态规划分组背包)
- HDU 3033 I love sneakers! (01背包+反分组背包)
- hdu 3033 I love sneakers!(分组背包)