6 条题解
-
2
#include <bits/stdc++.h> using namespace std; int n , m , j , k = 20000000; const int MAXN = 100000; int a[MAXN] , b[MAXN] , c[MAXN] , f[MAXN]; int main() { cin >> n >> m; int m1 = m + 5000; for(int i = 1 ; i <= n ; i++) { cin >> a[i] >> b[i]; } for(int i = 1 ; i <= m1 ; i++) { c[i] = 20000005;//定义一个很大的数从而去找哪个最小的数 } for(int i = 1 ; i <= n ; i++) { for(int j = a[i] ; j <= m1 ; j++) { c[j] = min(c[j] , c[j - a[i]] + b[i]);//找出最小的开销 } } for(int i = m ; i <= m1 ; i++) { k = min(k , c[i]); } cout << k; return 0; }
-
2
***一定要耐心看完!👀️ ***
咱就是说啊,诶算了不说了 以下加密版本啊(0写成O)
#include<bits/stdc++.h> using namespace std; const int N=1O5; const int M=55OO5; int n,h,p[N],c[N],d[M]; int main() { cin>>n>>h; for(int i=1;i<=n;i++) { cin>>p[i]>>c[i]; } memset(dp,63,sizeof(d)); d[O]=O; for(int i=1;i<=n;i++) { for(int j=p[i];j<=h+5OOO;j++) { d[j]=min(d[j],d[j-p[i]]+c[i]); } } int ans=1OOOOOOOOO; for(int i=h;i<=h+5OOO;i++) { ans=min(ans,d[i]); } cout<<ans; return O; }
算了不开玩笑了
#include<bits/stdc++.h> using namespace std; const int N=105; const int M=55005; int n,h,p[N],c[N],dp[M]; int main() { cin>>n>>h; for(int i=1;i<=n;i++) { cin>>p[i]>>c[i]; } memset(dp,63,sizeof(dp)); dp[0]=0; for(int i=1;i<=n;i++) { for(int j=p[i];j<=h+5000;j++) { dp[j]=min(dp[j],dp[j-p[i]]+c[i]); } } int ans=1000000000; for(int i=h;i<=h+5000;i++) { ans=min(ans,dp[i]); } cout<<ans; return 0; }
-
2
思路
这道题的基本思路就是完全背包,所以转移方程非常简单: $\\f[j]=min(f[j],f[j-p[i]]+c[i]);$ $\\$难点在于结果输出,当重量大于等于h,小于等于h与价格最大值的和时,最小值都有可能出现,不仅存于重量等于h时! $\\$最终答案在f[h]到f[h+5000]中间寻找,是考虑有可能买更多的干草包但花费的钱却更小,只需加上单个开销的最大值即可。代码
#include<iostream> using namespace std; #define INF 1e9 int n,h,f[55000],ans,p[105],c[105]; int main() { for (int i=1;i<=55000;i++) f[i]=INF; cin>>n>>h; for(int i=1;i<=n;i++) cin>>p[i]>>c[i]; for(int i=1;i<=n;i++) for(int j=p[i];j<=h+5000;j++) f[j]=min(f[j],f[j-p[i]]+c[i]); for(int i=h;i<=h+5000;i++) ans=min(ans,f[i]); cout<<ans; return 0; }
-
1
~~哦嘞嘞!哦啦啦!~~本题有亿点难,
这道题就是个完全背包问题,转移方程 is:fj]= min(f[j], f[j - p]]+ c]);(
懒得写,从老师那抄的方程)😄 。本题难点在于结果输出,重量大于等于h时并且小于等于h与价格最大值的和时,最小值都能出现!最终答案一 、一 、一定在f[h]~f[h+5000]中间寻找。别的按课中老师讲的做就OK了!
其实不是很难😄
#include <bits/stdc++.h> using namespace std; int n,m,y = 20000000; const int MAXN = 100000; int a[MAXN] , b[MAXN] , f[MAXN]; int main() { cin >> n >> m; int m1 = m + 5000; for(int i = 1;i <= n;i++) { cin >> a[i] >> b[i]; } for(int i = 1;i <= m1;i++) { f[i] = 20000005; } for(int i = 1;i <= n;i++) { for(int j = a[i];j <= m1;j++) { f[j] = min(f[j],f[j - a[i]] + b[i]); } } for(int = m;i <= m1;i++) { y = min(y,f[i]); } cout << y; return 0; }
-
-2
#include <bits/stdc++.h> #define ll long long #define endl "\n" using namespace std; int n, h, v[105], w[105], f[55005], ans = 0x3f3f3f3f; int main() { ios::sync_with_stdio(false); cin.tie(0); cin >> n >> h; for (int i = 1; i <= n; i++) { cin >> w[i] >> v[i]; } memset(f, 0x3f, sizeof(f)); f[0] = 0; for (int i = 1; i <= n; i++) { for (int j = w[i]; j <= h + 5000; j++) { f[j] = min(f[j], f[j - w[i]] + v[i]); } } for (int i = h; i <= h + 5000; i++) { ans = min(ans, f[i]); } cout << ans; return 0; }
-
-2
#include<bits/stdc++.h> using namespace std; const int N=105; const int M=55005; int n,h,p[N],c[N],dp[M]; int main() { cin>>n>>h; for(int i=1;i<=n;i++) { cin>>p[i]>>c[i]; } memset(dp,63,sizeof(dp)); dp[0]=0; for(int i=1;i<=n;i++) { for(int j=p[i];j<=h+5000;j++) { dp[j]=min(dp[j],dp[j-p[i]]+c[i]); } } int ans=1000000000; for(int i=h;i<=h+5000;i++) { ans=min(ans,dp[i]); } cout<<ans; return 0; }
- 1
信息
- ID
- 387
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 5
- 标签
- (无)
- 递交数
- 460
- 已通过
- 193
- 上传者