POJ-1170 Shopping Offers 状态压缩加背包
2015-03-15 19:03
344 查看
#include <stdio.h> #include <string.h> #include <iostream> #include <algorithm> #include <math.h> #define inf 1000000005 #define mem(a) memset(a, 0, sizeof(a)) using namespace std; int shu[1005], dp[8000], vt[105], v[1005], statu[105]; int n, nt; int huanliu(int nn) { int liu[6] = {0}, w = 1, sum = 0; while((nn / 6) != 0) { sum += (nn % 6) * v[w]; nn /= 6; w++; } if(nn != 0) sum += (nn * v[w]); return sum; } int main(int argc, char *argv[]) { int i, j, num, status = 0, sumv = 0, geshu, nums; mem(vt); mem(shu); mem(statu); mem(v); memset(dp, inf, sizeof(dp)); scanf("%d",&n); for(i = 1;i <= n;i++) { scanf("%d",&num); shu[num] = i; scanf("%d%d",&geshu, &v[i]); sumv += (geshu * v[i]); status += (geshu * (int)(pow(6.0, (double)(i - 1)))); } dp[status] = sumv; scanf("%d",&nt); for(i = 1;i <= nt;i++) { scanf("%d",&num); for(j = 1;j <= num;j++) { scanf("%d", &nums); scanf("%d", &geshu); statu[i] += (geshu * (int)(pow(6.0, (double)(shu[nums] - 1)))); } scanf("%d",&vt[i]); } dp[0] = 0; for(i = 1;i <= nt;i++) { for(j = 0;j <= status;j++) { if((j - statu[i]) >= 0) { dp[j] = min(dp[j], dp[j - statu[i]] + vt[i]); } } } for(i = 0;i <= status;i++) { dp[status] = min(dp[status], dp[i] + huanliu(status - i)); } printf("%d\n", dp[status]); return 0; }
因为题目说了 只有5种商品, 每种商品不会超过5, 所以我们可以用6进制的状态来表示当前物品的数量。 如 A 物品有3个, B 物品有 2个, 我们可以表示为 00023。
用此状态表示后, 写背包就行了。
相关文章推荐
- POJ 1170 Shopping Offers 6进制压缩状态+完全背包
- poj - 1170 - Shopping Offers(状态压缩dp)
- HDU 1170 Shopping Offers 离散+状态压缩+完全背包
- POJ 1170 shopping offers 状态压缩 记忆化搜索
- POJ 1170 Shopping Offers 状态压缩dp+完全背包
- 背包系列练习及总结(hud 2602 && hdu 2844 Coins && hdu 2159 && poj 1170 Shopping Offers && hdu 3092 Least common multiple && poj 1015 Jury Compromise)
- POJ 1170--Shopping Offers(状压+背包)
- POj 1170 Shopping Offers(变形背包+进制优化) 100
- poj1170 状态压缩背包
- poj 1170 Shopping Offers 完全背包
- POJ 1170 Shopping Offers(完全背包+哈希)
- poj 1170 Shopping Offers 动态规划绝对经典题目
- poj 2923 状态压缩 + 01背包
- POJ 1170 Shopping Offers -- 动态规划(虐心的六重循环啊!!!)
- poj 1170 Shopping Offers
- POJ - 1170 Shopping Offers (五维DP)
- POJ 1170 Shopping Offers(01背包)
- POJ 2923 Relocation(01背包变形, 状态压缩DP)
- poj 2923 dp状态压缩+背包(两辆货车来运货)
- poj 2923(状态压缩+背包)