题解 | #称砝码#

称砝码

https://www.nowcoder.com/practice/f9a4c19050fc477e9e27eb75f3bfd49c

#include <iostream>
#include <vector>
using namespace std;

int main() {
    int n;
    while (cin >> n) { // 注意 while 处理多个 case
        vector<int> weight(n);
        int sum = 0;
        for (int i = 0; i < n; i++)
            cin >> weight[i];
        for (int i = 0; i < n; i++) {
            int nums;
            cin >> nums;
            sum += nums * weight[i];
            while (--nums) {
                weight.push_back(weight[i]);
            }
        }
        vector<int> dp(sum + 1, 0);
        dp[0] = 1;
        for (int i = 0; i < weight.size(); i++) {
            // 表示j重量是否可以称到
            for (int j = sum; j >= weight[i]; j--) {
                if (dp[j]) continue;
                dp[j] = dp[j - weight[i]];
            }
        }
        sum = 0;
        for (int i : dp)
            sum += i;
        cout << sum << endl;
    }
  return 0;
}
// 64 位输出请用 printf("%lld")

全部评论

相关推荐

03-12 11:54
门头沟学院 Java
dghyuiok:佬太厉害了,我也27双非,只会黑马商城和苍穹外卖,靠这两个烂大街项目,装成大三面了4个一个没中
点赞 评论 收藏
分享
Debug_EVE:简历不要做成左右两页的,尽量做成上下一页
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务