239 条题解
-
0
★彭文立★ LV 3 @ 18 年前
看完题马上开写.3分钟,18行.
for i:=1 to n do
for j:=v downto a[i] do
f[j]:=f[j] or f[j-a[i]]; -
018 年前@
用贪心咯,到处都找得到的题。。。
-
018 年前@
与01背包类似的DP
-
018 年前@
下面说的是O(vn)的算法,有没有O(N^2)的?
-
019 年前@
一个简单的动态规划问题-01背包
f[i][j]=max{f[j],f[j-g[i]+g[i](j-g[i]>=0)}
f[0][j]=0
逐行递推答案即为(V-f[n][v]) -
-17 年前@
-
-17 年前@
#include <iostream>
using namespace std;int main()
{
int m,n;//m为质量,n为数量
cin>>m>>n;
int* w=new int [n];
for(int a=0;a<n;a++)
{
cin>>w[a];//每个石头的重量
}
int** c=new int* [n+1];
for(int a=0;a<=n;a++)
{
c[a]=new int [m+1];
for(int b=0;b<=m;b++)
{
c[a][b]=0;
}
}
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
if(w[i-1]<=j)
{
if(c[i-1][j]<c[i-1][j-w[i-1]]+w[i-1])
{
c[i][j]=c[i-1][j-w[i-1]]+w[i-1];
}
else
{
c[i][j]=c[i-1][j];
}
}
else
{
c[i][j]=c[i-1][j];
}
}
}
cout<<m-c[n][m];
return 0;
} -
-17 年前@
#include<cstdio>
#include<cmath>
#include<iostream>
#include<cstring>
using namespace std;
int v[35],V,n,f[20010],ans;
int main()
{
scanf("%d%d",&V,&n);
for(int i=1;i<=n;i++)
scanf("%d",&v[i]);
for(int i=1;i<=n;i++)
for(int j=V;j>=v[i];j--)
f[j]=max(f[j],f[j-v[i]]+v[i]);
ans=V-f[V];
printf("%d",ans);
return 0;
} -
-17 年前@
-
-18 年前@
N<30 暴力能过么
-
-18 年前@
AC留念
#include <iostream>
#include<cstdlib>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int f[20010],w[33];
int d(int x,int m){
int tot =0;
while(x>0)
{
if(x%10==m)
tot++;
x/=10;
}
return tot;
}
int main()
{
int v,n,i,j;
cin>>v>>n;
for(i=0;i<n;++i)
cin>>w[i];
for(i=0;i<n;++i)
for(j=v;j>=w[i];--j)
{
f[j] = max(f[j],f[j-w[i]]+w[i]);
}
cout<<v-f[v];
return 0;
} -
-18 年前@
-
-18 年前@
#include <iostream>
#include <vector>using namespace std;
vector <int> f,w;
int main()
{
int m,n;
int i,j;
cin>>m>>n;
f.resize(m+1);
w.resize(n+1);
for(i=1;i<=n;++i)
cin>>w[i];
for(i=0;i<=m;++i)
f[i]=0;
for(i=0;i<=n;++i)
for(j=m;j>=w[i];--j)
f[j]=max(f[j],f[j-w[i]]+w[i]);
cout<<m-f[m];
return 0;
} -
-18 年前@
-
-18 年前@
弱。。
```c++
#include <bits/stdc++.h>
using namespace std;bitset<20005> bit;
int main()
{
int n, m, a;
cin >> m >> n;
bit = 0;
bit[0] = 1;
for (int i = 1; i <= n; i++){
cin >> a;
bit |= bit<<a;
}
for (int i = m; i >= 0; i--)
if (bit[i]) {
cout << m-i << endl;
break;
}
return 0;
}
``` -
-18 年前@
-
-18 年前@
-
-18 年前@
#include
-
-18 年前@
#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
using namespace std;
int d[30000+3];
int main(){
int n,m;
cin>>n>>m;
for(int i=0;i<=n;i++) d[i]=i;
int v,w;
for(int i=1;i<=m;i++){
scanf("%d",&v);
for(int j=n;j>=0;j--)
if(j>=v&&d[j-v]>=0)
d[j]=min(d[j],d[j-v]);
}
cout<<d[n];
return 0;
}