寒冰王座(完全背包)

 2023-09-05 阅读 154 评论 0

摘要:传送原题 一道完全背包问题只要把01背包的j反过来就行 #include<iostream> #include<stdio.h> #include<algorithm> #include<queue> #include<math.h> #include<string.h> #include<sstream> using namespace std; int a[] =

传送原题
在这里插入图片描述

  • 一道完全背包问题
  • 只要把01背包的j反过来就行
#include<iostream>
#include<stdio.h>
#include<algorithm>
#include<queue>
#include<math.h>
#include<string.h>
#include<sstream>
using namespace std;
int a[] = {150,200,350};
int dp[10005];
int main() {ios::sync_with_stdio(false);int t, money;cin >> t;while(t --){memset(dp,0,sizeof(dp));cin >> money;for(int i = 0; i < 3; i ++)for(int j = a[i]; j <= money; j ++)dp[j] = max(dp[j], dp[j-a[i]] + a[i]);cout << money - dp[money] << endl;}return 0;
}
  • 然后我做了一个小优化,速度可能快了50倍,也可能没什么软用
#include<iostream>
#include<stdio.h>
#include<algorithm>
#include<queue>
#include<math.h>
#include<string.h>
#include<sstream>
using namespace std;
int a[] = {150,200,350};
int dp[10005];
int main() {ios::sync_with_stdio(false);int t, money;cin >> t;while(t --){memset(dp,0,sizeof(dp));int Max = 0;cin >> money;for(int i = 0; i < 3; i ++)for(int j = a[i]; j <= money; j += 50){//最大公因数dp[j] = max(dp[j], dp[j-a[i]] + a[i]);Max = max(Max,dp[j]);//防止出现不是整数啥的}cout << money - Max << endl;}return 0;
}

版权声明:本站所有资料均为网友推荐收集整理而来,仅供学习和研究交流使用。

原文链接:https://808629.com/142.html

发表评论:

本站为非赢利网站,部分文章来源或改编自互联网及其他公众平台,主要目的在于分享信息,版权归原作者所有,内容仅供读者参考,如有侵权请联系我们删除!

Copyright © 2022 86后生记录生活 Inc. 保留所有权利。

底部版权信息