#include <iostream> #include<cstring> using namespace std; int a[30]; int N; int Ways[50][40];//Ways[i][j]表示从前 j 种物品里凑出体积 i 的方法数 int main() { cin >> N; memset(Ways,0,sizeof(Ways)); for( int i = 1; i <= N; ++ i ) { cin >> a[i]; Ways[0][i] = 1; } Ways[0][0] = 1; for( int w = 1 ; w <= 40; ++ w ) { for( int k = 1; k <= N; ++ k ) { Ways[w][k] = Ways[w][k-1]; if( w-a[k] >= 0) Ways[w][k] += Ways[w-a[k]][k-1]; } } cout << Ways[40][N]; return 0; }每行代码的意思
时间: 2023-12-30 21:04:20 浏览: 101
#include <iostream>
这是一个背包问题的解法,可以用来求从一些物品中选出若干个物品,使得它们的体积之和恰好为40的方案数。代码中的变量含义如下:
- a[]:存储物品的体积。
- N:物品的数量。
- Ways[][]:动态规划数组,Ways[i][j]表示从前j种物品里凑出体积i的方法数。
- memset(Ways,0,sizeof(Ways)):将Ways数组全部初始化为0。
- Ways[0][i] = 1;:从前i种物品里凑出体积0的方法只有1种,即不选任何物品。
- Ways[0][0] = 1;:从前0种物品里凑出体积0的方法只有1种,即不选任何物品。
- 第一个for循环:读入物品体积,并初始化Ways数组。
- 第二个for循环:从小到大枚举体积w,从前往后枚举物品k,更新Ways[w][k]的值。具体来说,对于每一个Ways[w][k],先将其赋值为Ways[w][k-1],表示不选第k种物品;然后如果w-a[k]>=0,就再加上Ways[w-a[k]][k-1],表示选第k种物品。这样就完成了动态规划的转移。
- 最后输出Ways[40][N],即从前N种物品里凑出体积40的方案数。
阅读全文