看题目就知道本题就是经典动态规划的题目,对于动态规划一开始我是拒绝的,因为怎么也弄不会,怎么也找不到其中蕴含的公式,但是不得不承认它是牛逼的很牛逼!
其实这道题的思路还是挺简单的,我们看看样例最大我们能达到的重量是4,而我们要能达到4,当且仅当我们能达到2而且重量为2的砝码数量大于等于1。公式如下:
实现代码如下:
#include<iostream>
using namespace std;
int main()
{
int n,total=0,count=0;
int m[1000],weight[10], num[10];
cin >> n;
for (int i = 0; i < n; i++)
{
cin>>weight[i];
}
for (int i = 0; i < n; i++)
{
cin >> num[i];
}
for (int i = 0; i < n; i++)
{
total += weight[i]*num[i];
}
memset(m, 0, sizeof(int)* 300);
m[0] = 1;
for (int i = 0; i < n; i++)
{
for (int j = total; j >= 0; j--)
{
for (int k = 1; k <= num[i] && (j - weight[i] * k>=0); k++)
{
m[j] = m[j] | m[j - weight[i] * k];
}
}
}
for (int i = 0; i <= total; i++)
{
count += m[i];
}
cout << count << endl;
return 0;
}
结论:本题主要是循环所有类型的砝码,循环所能达到的所有大小,以及砝码所有数量,此程序巧妙的在于或操作,很妙!!!