sicily 1346 金明的预算方案 有依赖的背包问题

他还从因特网上查到了每件物品的价格(都是10元的整数倍)

注意这句话就ok了。。之间没留意,结果TLE

#include <iostream> #include <cmath> #include <cstring> using namespace std; struct node { int v; //价格 int p; //重要度 int q; //所属主件的编号 }data[61]; int f[60][32001]; //物品组 int n, m; int ans[32001]; int main() { //freopen("1.txt", "r", stdin); while(cin >> n >> m) { memset(f, -1, sizeof(f)); f[0][0] = 0; n /= 10; for(int i = 1; i <= m; i++) { cin >> data[i].v >> data[i].p >> data[i].q; data[i].v /= 10; f[i][0] = 0; } //对附件集合进行一次01背包 for(int i = 1; i <= m; i++) { if(data[i].q == 0) continue; for(int j = n; j >= data[i].v; j--) { if(f[data[i].q][j - data[i].v] != -1) { f[data[i].q][j] = max(f[data[i].q][j], f[data[i].q][j - data[i].v] + data[i].v * data[i].p); } } } //对价值进行处理,更新为各物品组主件+附件 for(int i = 1; i <= m; i++) { if(data[i].q != 0) continue; for(int j = n; j >= 0; j--) { if(f[i][j] != -1) { if(j + data[i].v > n) f[i][j] = -1; else { f[i][j + data[i].v] = max(f[i][j + data[i].v], f[i][j] + data[i].v * data[i].p); f[i][j] = -1; } } } } //变成有物品组的背包问题 memset(ans, -1, sizeof(ans)); ans[0] = 0; int _max = 0; for(int i = 1; i <= m; i++) { if(data[i].q != 0) continue; for(int j = n; j >= data[i].v; j--) { for(int k = j; k >= data[i].v; k--) { if(f[i][k] != -1 && ans[j - k] != -1) { ans[j] = max(ans[j], f[i][k] + ans[j - k]); _max = max(_max, ans[j]); } } } } cout << _max * 10 << endl; } return 0; }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值