411: 售货员的难题
#include<iostream>
#include<cstring>
using namespace std;
int dp[1<<20][20],a[21][21],b,ans=99999;
int main()
{
memset(dp,0x7f,sizeof(dp));
cin>>b;
for(int i=0;i<b;i++)
for(int j=0;j<b;j++)
cin>>a[i][j];
dp[1][0]=0;
for(int i=1;i<1<<b;i++)
for(register int j=0;j<b;j++)
if(i&1<<j)for(register int k=0;k<b;k++)
if(j!=k&&i&1<<k) dp[i][j]=min(dp[i][j],dp[i^1<<j][k]+a[k][j]);
for(int i=1;i<b;i++) ans=min(dp[(1<<b)-1][i]+a[i][0],ans);
cout<<ans<<endl;
}
594: Maximum Tape Utilization Ratio
#include<bits/stdc++.h>
using namespace std;
#define LL long long int
using namespace std;
struct node {
int sumv;
int count;
vector<LL>pre;
node() {
sumv = 0;
count = 0;
pre.clear();
}
};
int main()
{
ios::sync_with_stdio(false);
int n, m;
while (cin >> n >> m) {
node dp[6005];
int num[605];
for (int i = 0; i < n; i++)cin >> num[i];
//注意倒序,
for (int i = n - 1; i >= 0; i--) {
int s;
s = num[i];
for (int j = m; j >= 0; j--) {
if (j - s >= 0) {
if (dp[j].count < dp[j - s].count + 1||(dp[j].count == (dp[j - s].count + 1)
&& dp[j].sumv <= (dp[j - s].sumv + s)) ) {//注意等于::等于的时候直接覆盖掉,这样求出来的是最大的字典序
dp[j].count = dp[j - s].count + 1; //,但是我们是用的倒叙,所以反过来就是最小字典序
dp[j].pre = dp[j - s].pre;
dp[j].pre.push_back(s);
dp[j].sumv = dp[j - s].sumv + s;
}
}
}
}
cout << dp[m].count << ' ' << dp[m].sumv << endl;
int len = dp[m].pre.size();
//倒叙输出
for (int i = len-1; i >=0 ; i--) {
if (i != len-1)cout << ' ';
cout << dp[m].pre[i];
}
cout << endl;
}
return 0;
}
696: Soldiers
#include<bits/stdc++.h>
using namespace std;
int main(){
int n,a[10001],b[10001],sum=0;
cin>>n;
for (int i = 0; i < n; ++i) {
cin>>a[i]>>b[i];
}
sort(a,a+n);
sort(b,b+n);
for (int i = 0; i < n; ++i) {
a[i]-=i;
}
sort(a,a+n);
int mida=a[(n-1)/2];
int midb=b[(n-1)/2];
for (int i = 0; i < n; ++i) {
sum+= abs(a[i]-mida)+ abs(b[i]-midb);
}
cout<<sum<<endl;
return 0;
}
698: Independent Task Scheduling
#include<bits/stdc++.h>
using namespace std;
int main() {
int dp[10000], sum = 0, ans = 999999;
int n,a[200],b[200];
cin>>n;
for (int i = 0; i < n; ++i) {
cin>>a[i];
sum+=a[i];
dp[i]=0;
}
for (int i = 0; i < n; ++i) {
cin>>b[i];
}
for (int i = 0; i < n; ++i) {
for (int j = sum; j >=0 ; j--) {
if(j>=a[i]){
dp[j]=min(dp[j]+b[i],dp[j-a[i]]);
}
else{
dp[j]=dp[j]+b[i];
}
}
}
for (int i = 0; i <= sum; ++i) {
int t= max(i,dp[i]);
ans= min(t,ans);
}
cout<<ans<<endl;
}
699: Arbitrage
#include<bits/stdc++.h>
using namespace std;
double e[100][100];
int main(){
int n,m,cnt=0;
while(cin>>n,n){
memset(e,1,sizeof e);
string s,t;
map<string,int>mp;
for(int i=0;i<n;i++){
cin>>s;
mp[s]=i;
}
cin>>m;
for(int i=0;i<m;i++){
double x;
cin>>s>>x>>t;
e[mp[s]][mp[t]]=x;
}
for(int k=0;k<n;k++){
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
e[i][j]=max(e[i][j],e[i][k]*e[k][j]);
}
}
}
bool mark=0;
for(int i=0;i<n;i++){
if(e[i][i]>1){
mark=1;
break;
}
}
printf("Case %d %s\n",++cnt,(mark?"Yes":"No"));
}
}