hdu 3033 分组背包+01背包
来源:互联网 发布:淘宝网女士雪地靴 编辑:程序博客网 时间:2024/05/20 10:53
点击打开链接
#include <iostream>#include <algorithm>#include <cstring>using namespace std;const int M =110;typedef struct{int volum;int val;}Data;Data dat[M][M]; // dat[i][j] 第i组种物品中第j件的数据 int dp[M][11000]; // dp[i][j] 前i组物品 花费不大于j的最大价值 int l[M]; // l[i] 第i组物品的数量 int main(){int n,m,k;while(cin>>n>>m>>k){memset(l,0,sizeof(l));for(int i=1;i<=n;i++){int a,b,c;cin>>a>>b>>c;l[a]++;dat[a][l[a]].val=c;dat[a][l[a]].volum=b; }memset(dp,-1,sizeof(dp));// 保证对第i组操作时 前i-1组的物品至少都取了一件memset(dp[0],0,sizeof(dp[0])); // 前0组 for(int k1=1;k1<=k;k1++) // dp[k][j] =max(dp[k-1][j-c[i]]+w[i],dp[k][j-c[i]]+w[i]); { // 第k组只选了一件 第k组至少选一件 for(int i=1;i<=l[k1];i++)// 对每组进行(至少选一件)的01背包{for(int j=m;j>=dat[k1][i].volum;j--)// dp[k][i][j] 优化掉前i件 所以逆推 {if(dp[k1][j-dat[k1][i].volum]!=-1){dp[k1][j]=max(dp[k1][j],dp[k1][j-dat[k1][i].volum]+dat[k1][i].val);}if(dp[k1-1][j-dat[k1][i].volum]!=-1) //!=-1 如果选一件 则前K1-1组要符合条件 (即前K1-1组都至少都选了一件) {dp[k1][j]=max(dp[k1][j],dp[k1-1][j-dat[k1][i].volum]+dat[k1][i].val);}//因为物品体积可能为0 所以两个if 顺序不能变 // 若调换 则dp[k][j]= dp[k][j-0]+w= dp[k-1][j-0]+w +w 同一件物品被放了两次 }}}if(dp[k][m]!=-1)cout<<dp[k][m]<<endl;else{cout<<"Impossible"<<endl;}}return 0;}
0 0
- hdu 3033 分组背包+01背包
- HDU 3033 分组背包
- HDU 3033(分组背包)
- HDU 3033 分组背包
- hdu 3033 分组背包
- HDU 3033 分组背包
- HDU 3033 分组背包
- hdu 3033-分组背包
- HDU 4341-分组背包/01背包
- hdu 3033(分组背包)
- HDU 1712 分组背包
- 【分组背包】HDU 3535
- 【分组背包】HDU 1712
- hdu 3535 分组背包
- hdu 3303 分组背包
- HDU 1712 分组背包
- hdu 1712 分组背包
- hdu 1712 分组背包
- OSG 单视图 hudCamera 实现导航拖拽器
- Codeforces 80A Panoramix's Prediction
- linux驱动相关知识整理
- 两种提取OSG中纹理坐标的方法
- 人工智能算法
- hdu 3033 分组背包+01背包
- CodeForces615ABulbs(水题)
- 1043.输出PATest(20)
- Java加密解密算法-DES加密解密
- 函数输出100全部素数(while 与 if 区别)
- HDU5724(组合游戏,博弈论)
- 【离散数学】单射、满射和双射的定义、区别
- Android静态安全检测 -> 代码混淆检测
- CodeForces 454B Little Pony and Sort by Shift