动态规划——背包系列之砝码称重
2011-08-23 15:56
369 查看
【NOIP1996提高】砝码称重
Description
设有1g、2g、3g、5g、10g、20g的砝码各若干枚(其总重<=1000),要求
Input
输入方式:a1 a2 a3 a4 a5 a6(表示1g砝码有a1个,2g砝码有a2个,…,20g砝码有a6个)
Output
输出方式:Total=N(N表示用这些砝码能称出的不同重量的个数,但不包括一个砝码也不用的情况)
Sample Input
1 1 0 0 0 0 (注:下划线表示空格)
Sample Output
TOTAL=3 表示可以称出1g,2g,3g三种不同的重量
Description
设有1g、2g、3g、5g、10g、20g的砝码各若干枚(其总重<=1000),要求
Input
输入方式:a1 a2 a3 a4 a5 a6(表示1g砝码有a1个,2g砝码有a2个,…,20g砝码有a6个)
Output
输出方式:Total=N(N表示用这些砝码能称出的不同重量的个数,但不包括一个砝码也不用的情况)
Sample Input
1 1 0 0 0 0 (注:下划线表示空格)
Sample Output
TOTAL=3 表示可以称出1g,2g,3g三种不同的重量
#include <stdio.h> #include <stdlib.h> #define MAXN 1001 #define NUM 6 int main() { int i, j, k, sum, counts[NUM], a[NUM] = {1, 2, 3, 5, 10, 20}, f[NUM+1][MAXN] = {0}; for (i=0; i<NUM; i++) scanf("%d", counts + i); for (i=1; i<=NUM; i++) { for (j=0; j<MAXN; j++) { if (f[i-1][j] == 1) { f[i][j] = 1; } else { for (k=1; k<=counts[i-1]; k++) { if (j > k * a[i-1] && f[i-1][j-k*a[i-1]] == 1) { f[i][j] = 1; break; } else if (j == k*a[i-1]) { f[i][j] = 1; break; } } } } } sum = 0; for (i=1; i<MAXN; i++) { if (f[6][i] == 1) sum++; } printf("%d\n", sum); return 0; }
相关文章推荐
- 动态规划7:砝码和种类优化成01背包问题
- 动态规划---砝码称重问题
- 动态规划——背包系列之装箱问题
- 砝码称重问题求解:动态规划与母函数方法
- 动态规划:背包问题(DP系列)
- codevs砝码称重 回溯+动态规划
- 动态规划 || 威威猫系列故事——篮球梦 (类似背包)
- 算法细节系列(9):动态规划之01背包
- 动态规划——砝码称重
- 动态规划-砝码称重问题
- 砝码称重问题求解:动态规划与母函数方法
- 动态规划——砝码称重 收藏
- 动态规划之背包问题,最基础的动态规划
- leetcode 322. Coin Change 类似背包问题 + 很简单的动态规划DP解决
- 练习题 No.5 背包问题(动态规划-记忆化搜索)
- 动态规划01背包
- 动态规划之背包问题(01背包)
- 动态规划之0-1背包问题
- 动态规划之背包问题初研究
- 0/1背包问题动态规划详解