题目链接: 登录 - 沐枫OJ
开始思路:(是错的啦!!!)
//这是我参见背包问题,才58分
#include <bits/stdc++.h>
using namespace std;
const int N = 2e5+7;
int b[N];
int main(){
int v,n;
cin >> v >> n;
int arr[n];
for(int i = 1;i <= n;i++){
cin >> arr[i];
}
for(int i = 1;i <= n;i++){
for(int j = v;j >= 1;j--){
if(j>=arr[i]){
b[j] = max(b[j-arr[i]]+arr[i],b[j]);
}
}
}
cout << v - b[v];
return 0;
}
后面思路:
#include <bits/stdc++.h>
using namespace std;
const int N = 2e4+7;
int dp[N]; //dp[i]表示箱子容积为i时可放入的物品的体积 ,注意要初始化为0
int main ()
{
int v;//箱子体积
int n;//个数
cin >> v;
cin >> n;
int a[n]; //存放物品的体积
for(int i = 1;i <= n;i++)
cin >> a[i];
for(int i = 1;i <= n;i++)//外循环,遍历每个箱子
{
for(int j = v;j >= a[i];j--)//内循环,遍历每个容积
{
if(dp[j]>(dp[j-a[i]]+a[i]))
dp[j]=dp[j];
else
dp[j]=dp[j-a[i]]+a[i]; //取最大值,最优解
}
}
cout << v-dp[v]; //输出最小的容积
return 0;
}
网络博客:(两种思路,二维数组与一维数组)
//二维数组
#include<bits/stdc++.h>
using namespace std;
long long n,m,a[501][50001],w,v;
int max(int x,int y){
return x>y?x:y;
}
int main(){
freopen("happy.in","r",stdin);
freopen("happy.out","w",stdout);
scanf("%lld%lld",&n,&m);
for(int i=1;i<=m;i++){
cin>>w>>v;
for(int j=n;j>=1;j--){
if(w<=j) a[i][j]=max(a[i-1][j],a[i-1][j-w]+v*w);
else a[i][j]=a[i-1][j];
}
}
printf("%lld",a[m][n]);
}
//一维数组
#include<bits/stdc++.h>
using namespace std;
int n,m,w,v,f[30000005];
int max(int x,int y){
return x>y?x:y;
}
int main(){
freopen("happy.in","r",stdin);
freopen("happy.out","w",stdout);
scanf("%d%d",&m,&n);
for(int i=1;i<=n;i++){
cin>>v>>w;
for(int j=m;j>=v;j--) f[j]=max(f[j],f[j-v]+v*w);
}
cout<<f[m];
}
//那个freopen("happy.in","r",stdin);和freopen("happy.out","w",stdout);删了也没事,我试了!