标签:结束 std bit href print 统计 手写 include 最大
我金明那道破题还是错了!没开long long!
一、感想
蒟蒻如我,第一题想了半天都没想出来最大总和是多少……其它题倒是挺简单的,但是第一遍交的时候也卡了十分二十分的,因为数组开小了!这已经是我第n次因为数组开小而卡分了。现在还没结束比赛,但是我看到有两道题有一个人只拿了部分分,好慌,感觉那个人是我……
还是来说题吧!
二、题解
1、砝码称重
#include <bits/stdc++.h>//万能头并非长远之计,小朋友们不要学姐姐 using namespace std; int a[7]; int dp[10005]={}; long long sum=0,ans=0; int t[7]; int main() { t[1]=1;t[2]=2; t[3]=3;t[4]=5; t[5]=10;t[6]=20; for(int i=1;i<=6;i++) { scanf("%d",&a[i]); sum+=t[i]*a[i];//求能称出的最大质量 } for(int i=1;i<=6;i++) { for(int j=sum;j>=0;j--)//按称出的质量枚举 { for(int k=0;k<=a[i];k++)//选k个砝码 { if(j>=t[i]*k) dp[j]=max(dp[j],dp[j-t[i]*k]+t[i]*k);//多重背包状态转移 } } } for(int i=1;i<=sum;i++) { if(dp[i]==i) { ans++; } } printf("Total=%d",ans); return 0; }
2、装箱问题
#include<cstdio> using namespace std; int m,n; int f[20010]; int w[400]; int main() { int i,j; scanf("%d %d",&m,&n); for(i=1;i<=n;i++){ scanf("%d",&w[i]); } for(i=1;i<=n;i++){ for(j=m;j>=w[i];j--){ if(f[j]<f[j-w[i]]+w[i]){ f[j]=f[j-w[i]]+w[i]; } } } printf("%d",m-f[m]); return 0; }
3、采药
4、开心的金明
#include <bits/stdc++.h> using namespace std; int n,m; int v[30005],p[30005],dp[30005]; int main() { scanf("%d %d",&n,&m); for(int i=1;i<=m;i++)//顺手写了一个<=n…… { scanf("%d %d",&v[i],&p[i]); } for(int i=1;i<=m;i++) { for(int j=n;j>=v[i];j--) { dp[j]=max(dp[j],dp[j-v[i]]+v[i]*p[i]); } } printf("%d",dp[n]); return 0; }
5、竞赛总分
#include <bits/stdc++.h> using namespace std; int m,n; int t[10005],c[10005]; int dp[10005]; int main() { scanf("%d %d",&m,&n); for(int i=1;i<=n;i++) { scanf("%d %d",&c[i],&t[i]); } dp[0]=0; for(int i=1;i<=n;i++) { for(int j=t[i];j<=m;j++) { dp[j]=max(dp[j],dp[j-t[i]]+c[i]); } } printf("%d",dp[m]); return 0; } /* 0 */
好了,完结!
标签:结束 std bit href print 统计 手写 include 最大
原文地址:https://www.cnblogs.com/TheZealous/p/14819722.html