HDU 1114 完全背包问题的转化
2014-12-24 11:42
239 查看
题目大意:
根据存钱罐中钱的重量,和每一种钱对应的重量和价值,判断钱能否塞满这个重量,如果能,输出得到的最小价值
这个问题就是要把它和背包问题连接起来,这里钱取得数目是无穷的,所以这里只需要用到完全背包来解决问题
在这里我们定义dp[i][j] 作为重量 j 的条件下,取前 i 中硬币塞满背包可得到的最小价值
1.dp[i][j] = min{dp[i-1][j] , dp[i-1][j-w] + w} 但这里前提是dp[i-1][j-w]和dp[i-1][j]都存在这样的情况
2.如果dp[i-1][j-w]存在dp[i-1][j]不存在,那么dp[i][j] = dp[i-1][j]直接赋值
3.如果均不成立,那么dp[i][j] = 0 表示不存在
然后同样根据背包的思想,二维数组压缩不断滚动更新压缩为一维数组dp[i],表示当前状态在 i 重量下取到的最小值
根据存钱罐中钱的重量,和每一种钱对应的重量和价值,判断钱能否塞满这个重量,如果能,输出得到的最小价值
这个问题就是要把它和背包问题连接起来,这里钱取得数目是无穷的,所以这里只需要用到完全背包来解决问题
在这里我们定义dp[i][j] 作为重量 j 的条件下,取前 i 中硬币塞满背包可得到的最小价值
1.dp[i][j] = min{dp[i-1][j] , dp[i-1][j-w] + w} 但这里前提是dp[i-1][j-w]和dp[i-1][j]都存在这样的情况
2.如果dp[i-1][j-w]存在dp[i-1][j]不存在,那么dp[i][j] = dp[i-1][j]直接赋值
3.如果均不成立,那么dp[i][j] = 0 表示不存在
然后同样根据背包的思想,二维数组压缩不断滚动更新压缩为一维数组dp[i],表示当前状态在 i 重量下取到的最小值
#include <cstdio> #include <cstring> using namespace std; const int N = 10005; #define min(a,b) a<b?a:b int dp , M; int main() { int T , E , F , k , w , v; scanf("%d" , &T); while(T--){ scanf("%d%d" , &E , &F); M = F-E; scanf("%d" , &k); memset(dp , 0 , sizeof(dp)); for(int i=0 ; i<k ; i++){ scanf("%d%d" , &v , &w); //用完全背包的形式处理 for(int i = w ; i<=M ; i++) if(dp[i-w] > 0 || i-w == 0){ if(dp[i] > 0) dp[i] = min(dp[i] , dp[i-w]+v); else dp[i] = dp[i-w]+v; } } if(dp[M] == 0) puts("This is impossible."); else{ printf("The minimum amount of money in the piggy-bank is %d.\n" , dp[M]); } } }
相关文章推荐
- POJ 1384 && HDU 1114 Piggy-Bank(完全背包问题)
- HDU-1114 Piggy-Bank(完全背包问题)
- hdu 1114 Piggy-Bank 完全背包问题
- 【HDU 1114】Piggy-Bank(dp||完全背包问题)
- HDU 1114 Piggy-Bank (dp问题之完全背包问题)
- HDU 1114 Piggy-Bank(完全背包问题)
- HDU 1114 Piggy-Bank(完全背包问题)
- 01背包及完全背包问题(51Nod - 1085,HDU 1114 Piggy-Bank)
- HDU 1114 Piggy-Bank(完全背包问题)【完全背包--刚好装满 模板】
- HDU1114(完全背包问题)
- hdu 1114 Piggy-Bank(完全背包问题)
- hdu 1114 完全背包 背包问题通俗讲解
- HDU-1114 完全背包+恰好装满问题
- HDU 1114 又见完全背包问题(必须装满)
- hdu 1114需要装满的完全背包 重点是背包初始化的问题
- hdu 1114 Piggy-Bank 动态规划 之完全背包问题
- HDU 1114 完全背包问题
- hdu 1114 完全背包问题
- hdu 1114完全背包问题
- HDU 1114 Piggy-Bank(完全背包)